Updated 1/15/2025 by K.Lenderman - data check - added new code for 2026 data

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Warning: package ‘plyr’ was built under R version 4.5.1------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following object is masked from ‘package:purrr’:

    compact

The following object is masked from ‘package:ggpubr’:

    mutate

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise,
    summarize

Warning: package ‘Rmisc’ was built under R version 4.5.1Loading required package: lattice

This code chunk merges all .csv files within the Tissue processing folder into one data frame and outputs the full dataset into a .csv master file. This allows us to download the raw data as a .csv, add it to the repository folder, and create the master data file without copying and pasting data in excel.

reading in .csv files from local folder


#data_all <- list.files(path = "Lab_Data_TissueProcessing/raw_data/Files_by_Month",                           # Identify all CSV files
# pattern = "*.csv", full.names = TRUE) %>% 
#lapply(read_csv) %>%   # Store all files in list
#  bind_rows          # Combine data sets into one data set 
#data_all                                            # Print data to RStudio console


#as.data.frame(data_all)  # Convert tibble to data.frame


#Filtering NAs and unnecessary columns
#data_all <- data_all %>% filter(!is.na(date_collected))
#data_all <- select(data_all, -light_regime, -oyster_zone)


#write.csv(data_all, "Master_files/tissue_processing_all_data.csv", row.names=FALSE)




##### USE THIS CODE TO MERGE DATA FILES - some of the files have columns that are not the same format (dates specifically), which was causing issues in merging. This code below should solve that problem. It converts all date columns to dates and m/d/y format #####



file_paths <- list.files(path = "Lab_Data_TissueProcessing/raw_data/Files_by_Month",
                          pattern = "*.csv", full.names = TRUE)


data_all <- lapply(file_paths, function(file_path) {
  read_csv(file_path) %>%
    mutate(
      date_collected = as.Date(date_collected,format = "%m/%d/%Y"),
      date_processed = as.Date(date_processed,format = "%m/%d/%Y"),
      date_davidsons = as.Date(date_davidsons,format = "%m/%d/%Y"),
      date_etoh = as.Date(date_etoh,format = "%m/%d/%Y")
    )
}) %>%
  bind_rows
New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 38 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, oyster_zone, condition
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): light_regime, dissection_notes, mantle_rftm, ggr1_etoh, ggr2_etoh...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (18): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 27── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): lab_id, date_collected, site, date_processed, condition, date_davi...
dbl  (2): lab_sample, height_mm
lgl (18): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 27── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): lab_id, date_collected, site, date_processed, condition, date_davi...
dbl  (2): lab_sample, height_mm
lgl (18): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (18): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 27── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (7): lab_id, date_collected, site, date_processed, condition, date_davi...
dbl  (2): lab_sample, height_mm
lgl (18): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 35 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 46 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 27── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (8): lab_id, date_collected, site, date_processed, condition, sample_no...
dbl  (2): lab_sample, height_mm
lgl (17): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 998 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (21): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (21): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (21): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (21): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (3): date_collected, date_processed, date_davidsons
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (18): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (18): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Rows: 36 Columns: 20── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (4): lab_id, site, condition, dissection_notes
dbl  (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (7): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, addu...
date (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (4): lab_id, site, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (20): oyster_zone, light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, add...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): lab_id, site, oyster_zone, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (19): light_regime, mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, c...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 33── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): lab_id, site, oyster_zone, light_regime, condition, dissection_notes
dbl   (5): lab_sample, ww_total_g, height_mm, length_mm, width_mm
lgl  (18): mantle_rftm, ggr1_etoh, ggr2_etoh, adductor_etoh, cross_histology...
date  (4): date_collected, date_processed, date_davidsons, date_etoh
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 999 Columns: 27── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (8): lab_id, date_collected, site, date_processed, condition, sample_no...
dbl  (2): lab_sample, height_mm
lgl (17): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (8): lab_id, date_collected, site, date_processed, condition, sample_not...
dbl (2): lab_sample, height_mm
lgl (7): mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology, ...15, ...16,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 36 Columns: 17── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (8): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Rows: 9 Columns: 14── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): lab_id, date_collected, site, date_processed, condition, date_david...
dbl (2): lab_sample, height_mm
lgl (5): sample_notes, mantle_rftm, ggr1_frozen, ggr2_etoh, cross_histology
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
as.data.frame(data_all)  # Convert tibble to data.frame

data_all <- data_all %>% filter(!is.na(date_collected))
data_all <- select(data_all, -light_regime, -oyster_zone)


data_all
NA
NA
NA

#A wrong value caliper input was identified for the height of sample 0923GOLD_23. This code is removing that value from the data set as we cannot conclude what this original value was. The value is 8.62. This will cause this individual to fall out of the dataset when standardized to length. This code does not completely remove the individual from the dataset.

data_all$height_mm[data_all$height_mm == "0"] <- NA

adding a month & year column to the data

data_all <- data_all %>% dplyr::mutate(date_collected= as.Date(date_collected), month = month(date_collected))

data_all <- data_all %>% dplyr::mutate(date_collected= as.Date(date_collected), year = year(date_collected))

#changing numeric month to month name
data_all$month <- factor(data_all$month, levels = c("1","2","3","4","5","6","7", "8", "9", "10", "11", "12"),
        labels=c("Jan","Feb", "March","April","May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"))

data_all

This chunk of code creates a numerical value in a new column for the body condition scores


data_all<- data_all %>%
 dplyr::mutate(condition_score = recode(condition, "1_very_good" = 1, "2_good" = 2, "3_good_minus"= 3, "4_fair_plus"= 4, "5_fair"= 5,"6_fair_minus"=6,"7_poor_plus"=7, "8_poor"= 8, "9_very_poor"= 9))
Warning: There was 1 warning in `dplyr::mutate()`.
ℹ In argument: `condition_score = recode(...)`.
Caused by warning:
! Unreplaced values treated as NA as `.x` is not compatible.
Please specify replacements exhaustively or supply `.default`.
head(data_all)
NA

#This chunk of code is removing 0723LAUR_20 and 0723LAUR_26 from the datasheet as they have been identified as spat on shell to avoid bias in the data. During this sample collection there were animals that were significantly smaller than the single set oysters. These individuals should be removed from all monthly sampling related datasheets including disease analysis. All tissue amples will be disgarded.

data_all <- data_all %>%
  subset(lab_id != "0723LAUR_20") %>%
  subset(lab_id != "0723LAUR_26")

data_all
NA

Summary of all data - height

st_height <- summarySE(data_all%>% filter(!is.na(height_mm)), measurevar="height_mm", groupvars=c("site", "date_collected"))

st_height 

#Calculate completeness for QC
st_height$Completeness <- st_height$N /30

st_height

write.csv(st_height, "Lab_Data_TissueProcessing/output\\Completeness_tissue_processing_data.csv", row.names=FALSE)

#Mean Height

ggplot(data=data_all, aes(x=site, y=height_mm, fill=site)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Mean Shell Height ", x ="site", y = "Mean Shell Height (mm)") + facet_wrap(.~year)

#Body condition

ggplot(data=data_all, aes(x=site, y=condition_score, fill=site)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Mean Condition Score ", x ="site", y = "Mean Body Condition Score")+ scale_y_reverse()+ facet_wrap(.~year)


mean_body_condition <- data_all %>%
  dplyr::group_by(site, month, year)%>%
  dplyr::summarize(mean_bsc = mean(condition_score, na.rm = TRUE))
`summarise()` has grouped output by 'site', 'month'. You can override using the `.groups` argument.
mean_body_condition

#for overlay graph
#mean_bcs_ashc <- mean_body_condition %>%
  #filter(site == "ASHC") %>%
  #filter(year == "2024")

#Mean body condtion scores - 2023
data_2023 <- data_all%>%  filter(year=="2023")
  
ggplot(data=data_2023, aes(x=month, y=condition_score, group = month, fill = site)) +
  geom_boxplot()+ 
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = -35, vjust = 0.5, hjust=1))+
  labs(title="Mean Condition Score - 2023", x ="month", y = "Mean Body Condition Score")+ scale_y_reverse()+facet_wrap(~site)


#Mean body condtion scores - 2024
data_2024 <- data_all%>%  filter(year=="2024")
  
ggplot(data=data_2024, aes(x=month, y=condition_score, group = month, fill = site)) +
  geom_boxplot()+ 
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = -35, vjust = 0.5, hjust=1))+
  labs(title="Mean Condition Score - 2024", x ="month", y = "Mean Body Condition Score")+ scale_y_reverse()+facet_wrap(~site)


#Mean body condition scores - 2025
data_2025 <- data_all%>%  filter(year=="2025")
  
ggplot(data=data_2025, aes(x=month, y=condition_score, group = month, fill = site)) +
  geom_boxplot()+ 
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = -35, vjust = 0.5, hjust=1))+
  labs(title="Mean Condition Score - 2025", x ="month", y = "Mean Body Condition Score")+ scale_y_reverse()+facet_wrap(~site)


#Mean body condition scores - 2026
data_2026 <- data_all%>%  filter(year=="2026")
  
ggplot(data=data_2026, aes(x=month, y=condition_score, group = month, fill = site)) +
  geom_boxplot()+ 
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = -35, vjust = 0.5, hjust=1))+
  labs(title="Mean Condition Score - 2026", x ="month", y = "Mean Body Condition Score")+ scale_y_reverse()+facet_wrap(~site)

#Proportions graph Body condition scores

#Proportions graph Body condition scores - 2023

df_BCS_proportions2023<- data_2023 %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%

  group_by(site, month, year, condition_score_bin) %>% dplyr ::summarise(Count= n()) %>%

  ungroup() %>%
  mutate(Proportion = Count/sum(Count))
`summarise()` has grouped output by 'site', 'month', 'year'. You can override using the `.groups` argument.
df_BCS_proportions2023<- na.omit(df_BCS_proportions2023)

BCS_proportion_all_2023<- ggplot(data=df_BCS_proportions2023, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 0, vjust = .4, hjust=.5))+
  labs(title="Proportion of body condition scores - 2023", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  scale_fill_brewer(palette = "Blues", direction = -1)+scale_x_continuous("Month", breaks = c(1,2,3,4,5,6,7,8,9,10,11,12))+ 
  facet_wrap(~ site)

BCS_proportion_all_2023



#pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/all_BCS_proportion_2023.pdf"), height = 7, width = 13)
#print(BCS_proportion_all_2023)
#dev.off()
#Proportions graph Body condition scores - 2024
df_BCS_proportions2024<- data_2024 %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%

  group_by(site, month, year, condition_score_bin) %>% dplyr ::summarise(Count= n()) %>%

  ungroup() %>%
  mutate(Proportion = Count/sum(Count))
`summarise()` has grouped output by 'site', 'month', 'year'. You can override using the `.groups` argument.
df_BCS_proportions2024<- na.omit(df_BCS_proportions2024)

BCS_proportion_all_2024<- ggplot(data=df_BCS_proportions2024, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 0, vjust = .4, hjust=.5))+
  labs(title="Proportion of body condition scores - 2024", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  scale_fill_brewer(palette = "Blues", direction = -1)+
  scale_x_continuous("Month", breaks = c(1,2,3,4,5,6,7,8,9,10,11,12))+ 
  facet_wrap(~ site)

BCS_proportion_all_2024


#pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/all_BCS_proportion_2024.pdf"), height = 7, width = 13)
#print(BCS_proportion_all_2024)
#dev.off()
#Proportions graph Body condition scores - 2025
df_BCS_proportions2025<- data_2025 %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%

  group_by(site, month, year, condition_score_bin) %>% dplyr ::summarise(Count= n()) %>%

  ungroup() %>%
  mutate(Proportion = Count/sum(Count))
`summarise()` has grouped output by 'site', 'month', 'year'. You can override using the `.groups` argument.
df_BCS_proportions2025<- na.omit(df_BCS_proportions2025)

BCS_proportion_all_2025<- ggplot(data=df_BCS_proportions2025, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 0, vjust = .4, hjust=.5))+
  labs(title="Proportion of body condition scores - 2025", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  scale_fill_brewer(palette = "Blues", direction = -1)+
  scale_x_continuous("Month", breaks = c(1,2,3,4,5,6,7,8,9,10,11,12))+ 
  facet_wrap(~ site)#, scales = "free")

BCS_proportion_all_2025


# pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/all_BCS_proportion_2025.pdf"), height = 7, width = 13)
# print(BCS_proportion_all_2025)
# dev.off()
#Proportions graph Body condition scores - 2026
df_BCS_proportions2026<- data_2026 %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%

  group_by(site, month, year, condition_score_bin) %>% dplyr ::summarise(Count= n()) %>%

  ungroup() %>%
  mutate(Proportion = Count/sum(Count))
`summarise()` has grouped output by 'site', 'month', 'year'. You can override using the `.groups` argument.
df_BCS_proportions2026<- na.omit(df_BCS_proportions2026)

BCS_proportion_all_2026<- ggplot(data=df_BCS_proportions2026, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 0, vjust = .4, hjust=.5))+
  labs(title="Proportion of body condition scores - 2026", x ="Month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  scale_fill_brewer(palette = "Blues", direction = -1)+
  scale_x_continuous("Month", breaks = c(1,2,3,4,5,6,7,8,9,10,11,12))+ 
  facet_wrap(~ site)#, scales = "free")

BCS_proportion_all_2026

pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/all_BCS_proportion_2026.pdf"), height = 7, width = 13)
print(BCS_proportion_all_2026)
dev.off()
png 
  2 


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI1dpbnRlciBzYW1wbGluZyBcbiMgd2ludGVyX2JjcyA8LSByYmluZChkZl9CQ1NfcHJvcG9ydGlvbnMyMDI0LCBkZl9CQ1NfcHJvcG9ydGlvbnMyMDI1KVxuIyBcbiMgd2ludGVyX2JjcyA8LSB3aW50ZXJfYmNzICU+JSBmaWx0ZXIobW9udGggPT0gXCJEZWNcInxtb250aCA9PSBcIkphblwifG1vbnRoID09IFwiRmViXCIpXG4jIFxuIyBCQ1NfcHJvcG9ydGlvbl93aW50ZXI8LSBnZ3Bsb3QoZGF0YT13aW50ZXJfYmNzLCBhZXMoeD1mYWN0b3IgKG1vbnRoLCBsZXZlbD1jKCdEZWMnLCAnSmFuJywgJ0ZlYicpKSwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgK1xuIyAgIGdlb21fYmFyKHdpZHRoID0gLjUsIHN0YXQ9XCJpZGVudGl0eVwiLCBwb3NpdGlvbiA9IFwiZmlsbFwiLCBjb2xvdXIgPSBcImJsYWNrXCIpKyAgXG4jICAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIFxuIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3Q9MSkpK1xuIyAgIGxhYnModGl0bGU9XCJQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAtIFdpbnRlciBTYW1wbGluZyAyMDI0LTIwMjVcIiwgeCA9XCJNb250aFwiLCB5ID0gXCJQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyBcIikrIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID05MCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCkpK1xuIyAgIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpK1xuIyAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSBcIkJsdWVzXCIsIGRpcmVjdGlvbiA9IC0xKStcbiMgICBmYWNldF93cmFwKH4gc2l0ZSlcbiMgXG4jIEJDU19wcm9wb3J0aW9uX3dpbnRlclxuYGBgIn0= -->

```r
#Winter sampling 
# winter_bcs <- rbind(df_BCS_proportions2024, df_BCS_proportions2025)
# 
# winter_bcs <- winter_bcs %>% filter(month == \Dec\|month == \Jan\|month == \Feb\)
# 
# BCS_proportion_winter<- ggplot(data=winter_bcs, aes(x=factor (month, level=c('Dec', 'Jan', 'Feb')), y= Proportion, fill=condition_score_bin)) +
#   geom_bar(width = .5, stat=\identity\, position = \fill\, colour = \black\)+  
#    theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
#   theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
#   labs(title=\Proportion of body condition scores - Winter Sampling 2024-2025\, x =\Month\, y = \Proportion of body condition scores \)+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
#   theme(axis.text=element_text(size=12))+
#   scale_fill_brewer(palette = \Blues\, direction = -1)+
#   facet_wrap(~ site)
# 
# BCS_proportion_winter
```

<!-- rnb-source-end -->
```r
#Winter sampling 
# winter_bcs <- rbind(df_BCS_proportions2024, df_BCS_proportions2025)
# 
# winter_bcs <- winter_bcs %>% filter(month == \Dec\|month == \Jan\|month == \Feb\)
# 
# BCS_proportion_winter<- ggplot(data=winter_bcs, aes(x=factor (month, level=c('Dec', 'Jan', 'Feb')), y= Proportion, fill=condition_score_bin)) +
#   geom_bar(width = .5, stat=\identity\, position = \fill\, colour = \black\)+  
#    theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
#   theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
#   labs(title=\Proportion of body condition scores - Winter Sampling 2024-2025\, x =\Month\, y = \Proportion of body condition scores \)+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
#   theme(axis.text=element_text(size=12))+
#   scale_fill_brewer(palette = \Blues\, direction = -1)+
#   facet_wrap(~ site)
# 
# BCS_proportion_winter

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJRY205d2IzSjBhVzl1SUhCbGNpQnRiMjUwYUNCdlppQnBiblJsYm5OcGRIa2djMk52Y21WeklHRjBJSFJvY21WbElITnBkR1Z6SUdSMWNtbHVaeUF5TURJeklDWWdNakF5TkNBbUlESXdNalVnSmlBeU1ESTJYRzVrWmw5aVkzTmZjSEp2Y0c5eWRHbHZibk5mYm1WM0lEd3RJSEppYVc1a0tHUm1YMEpEVTE5d2NtOXdiM0owYVc5dWN6SXdNak1zSUdSbVgwSkRVMTl3Y205d2IzSjBhVzl1Y3pJd01qUXNJR1JtWDBKRFUxOXdjbTl3YjNKMGFXOXVjekl3TWpVc0lHUm1YMEpEVTE5d2NtOXdiM0owYVc5dWN6SXdNallwWEc1Y2JtUm1YMkpqYzE5d2NtOXdiM0owYVc5dWMxOXVaWGM4TFNCa1psOWlZM05mY0hKdmNHOXlkR2x2Ym5OZmJtVjNJQ1UrSlNCbWFXeDBaWElvSVhOcGRHVTlQVndpVEVGVlVsd2lLVnh1WEc1UWNtOXdiM0owYVc5dVgyOW1YMEp2WkhsZlEyOXVaR2wwYVc5dVgxTmpiM0psY3lBOExTQm5aM0JzYjNRb1pHRjBZVDFrWmw5aVkzTmZjSEp2Y0c5eWRHbHZibk5mYm1WM0xDQmhaWE1vZUQxdGIyNTBhQ3dnZVQwZ1VISnZjRzl5ZEdsdmJpd2dabWxzYkQxamIyNWthWFJwYjI1ZmMyTnZjbVZmWW1sdUtTa2dLMXh1SUNCblpXOXRYMkpoY2loM2FXUjBhQ0E5SUM0MUxDQnpkR0YwUFZ3aWFXUmxiblJwZEhsY0lpd2djRzl6YVhScGIyNGdQU0JjSW1acGJHeGNJaXhqYjJ4dmRYSWdQU0JjSW1Kc1lXTnJYQ0lwS3lBZ1hHNGdJQ0IwYUdWdFpWOWlkeWdwSUNzZ0lIUm9aVzFsS0hCaGJtVnNMbWR5YVdRdWJXRnFiM0lnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2tzSUhCaGJtVnNMbWR5YVdRdWJXbHViM0lnUFNCbGJHVnRaVzUwWDJKc1lXNXJLQ2twSzF4dUlDQjBhR1Z0WlNoaGVHbHpMblJsZUhRdWVDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoaGJtZHNaU0E5SURBc0lIWnFkWE4wSUQwZ01Td2dhR3AxYzNROUxqVXBLU3RjYmlBZ2JHRmljeWhtYVd4c0lEMWNJa0p2WkhrZ1EyOXVaR2wwYVc5dUlGTmpiM0psYzF3aUxDQmxiR1Z0Wlc1MFgzUmxlSFFvYzJsNlpTQTlJREV1TlNrcEsxeHVJQ0JzWVdKektIUnBkR3hsUFZ3aVVISnZjRzl5ZEdsdmJpQnZaaUJDYjJSNUlFTnZibVJwZEdsdmJpQlRZMjl5WlhOY0lpd2dlQ0E5WENKdGIyNTBhRndpTENCNUlEMGdYQ0pRY205d2IzSjBhVzl1WENJcEt5QjBhR1Z0WlNoaGVHbHpMblJwZEd4bExua2dQU0JsYkdWdFpXNTBYM1JsZUhRb2MybDZaU0E5SUhKbGJDZ3hMakFwTENCaGJtZHNaU0E5T1RBcExDQmhlR2x6TG5ScGRHeGxMbmdnUFNCbGJHVnRaVzUwWDNSbGVIUW9jMmw2WlNBOUlISmxiQ2d4TGpBcExDQmhibWRzWlNBOUlEQXBLU3NnWEc0Z0lIUm9aVzFsS0hScGRHeGxJRDBnWld4bGJXVnVkRjkwWlhoMEtITnBlbVVnUFNBeU1Da3BLMXh1SUNCMGFHVnRaU2hoZUdsekxuUmxlSFE5Wld4bGJXVnVkRjkwWlhoMEtITnBlbVU5TVRJcEtTdGNibk5qWVd4bFgyWnBiR3hmWW5KbGQyVnlLSEJoYkdWMGRHVWdQU0JjSWtKc2RXVnpYQ0lzSUdScGNtVmpkR2x2YmlBOUlDMHhLU3NnSTJOaGJpQjFjMlVnY0dGc1pYUjBaU0JjSWxOd1pXTjBjbUZzWENKY2JpQWdjMk5oYkdWZmVGOWpiMjUwYVc1MWIzVnpLRndpVFc5dWRHaGNJaXdnWW5KbFlXdHpJRDBnWXlneExESXNNeXcwTERVc05pdzNMRGdzT1N3eE1Dd3hNU3d4TWlrcEt5QnpZMkZzWlY5emFYcGxLR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnY21Wc0tERXVNQ2twS1N0Y2JpQWdabUZqWlhSZlozSnBaQ2g1WldGeUlINXphWFJsS1N0Y2JpQWdkR2hsYldVb2MzUnlhWEF1ZEdWNGRDQTlJR1ZzWlcxbGJuUmZkR1Y0ZENoemFYcGxJRDBnTVRVcEtTdDBhR1Z0WlNoc1pXZGxibVF1Y0c5emFYUnBiMjRnUFNCY0luSnBaMmgwWENJcFhHNWNiaUFnY0hKcGJuUW9VSEp2Y0c5eWRHbHZibDl2Wmw5Q2IyUjVYME52Ym1ScGRHbHZibDlUWTI5eVpYTXBYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbiMgUHJvcG9ydGlvbiBwZXIgbW9udGggb2YgaW50ZW5zaXR5IHNjb3JlcyBhdCB0aHJlZSBzaXRlcyBkdXJpbmcgMjAyMyAmIDIwMjQgJiAyMDI1ICYgMjAyNlxuZGZfYmNzX3Byb3BvcnRpb25zX25ldyA8LSByYmluZChkZl9CQ1NfcHJvcG9ydGlvbnMyMDIzLCBkZl9CQ1NfcHJvcG9ydGlvbnMyMDI0LCBkZl9CQ1NfcHJvcG9ydGlvbnMyMDI1LCBkZl9CQ1NfcHJvcG9ydGlvbnMyMDI2KVxuXG5kZl9iY3NfcHJvcG9ydGlvbnNfbmV3PC0gZGZfYmNzX3Byb3BvcnRpb25zX25ldyAlPiUgZmlsdGVyKCFzaXRlPT1cIkxBVVJcIilcblxuUHJvcG9ydGlvbl9vZl9Cb2R5X0NvbmRpdGlvbl9TY29yZXMgPC0gZ2dwbG90KGRhdGE9ZGZfYmNzX3Byb3BvcnRpb25zX25ldywgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICtcbiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD1cImlkZW50aXR5XCIsIHBvc2l0aW9uID0gXCJmaWxsXCIsY29sb3VyID0gXCJibGFja1wiKSsgIFxuICAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKStcbiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCB2anVzdCA9IDEsIGhqdXN0PS41KSkrXG4gIGxhYnMoZmlsbCA9XCJCb2R5IENvbmRpdGlvbiBTY29yZXNcIiwgZWxlbWVudF90ZXh0KHNpemUgPSAxLjUpKStcbiAgbGFicyh0aXRsZT1cIlByb3BvcnRpb24gb2YgQm9keSBDb25kaXRpb24gU2NvcmVzXCIsIHggPVwibW9udGhcIiwgeSA9IFwiUHJvcG9ydGlvblwiKSsgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4wKSwgYW5nbGUgPTkwKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4wKSwgYW5nbGUgPSAwKSkrIFxuICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKStcbiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkrXG5zY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gXCJCbHVlc1wiLCBkaXJlY3Rpb24gPSAtMSkrICNjYW4gdXNlIHBhbGV0dGUgXCJTcGVjdHJhbFwiXG4gIHNjYWxlX3hfY29udGludW91cyhcIk1vbnRoXCIsIGJyZWFrcyA9IGMoMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIpKSsgc2NhbGVfc2l6ZShlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjApKSkrXG4gIGZhY2V0X2dyaWQoeWVhciB+c2l0ZSkrXG4gIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJyaWdodFwiKVxuXG4gIHByaW50KFByb3BvcnRpb25fb2ZfQm9keV9Db25kaXRpb25fU2NvcmVzKVxuYGBgXG5cbjwhLS0gcm5iLXNvdXJjZS1lbmQgLS0+XG4ifQ== -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBQcm9wb3J0aW9uIHBlciBtb250aCBvZiBpbnRlbnNpdHkgc2NvcmVzIGF0IHRocmVlIHNpdGVzIGR1cmluZyAyMDIzICYgMjAyNCAmIDIwMjUgJiAyMDI2XG5kZl9iY3NfcHJvcG9ydGlvbnNfbmV3IDwtIHJiaW5kKGRmX0JDU19wcm9wb3J0aW9uczIwMjMsIGRmX0JDU19wcm9wb3J0aW9uczIwMjQsIGRmX0JDU19wcm9wb3J0aW9uczIwMjUsIGRmX0JDU19wcm9wb3J0aW9uczIwMjYpXG5cbmRmX2Jjc19wcm9wb3J0aW9uc19uZXc8LSBkZl9iY3NfcHJvcG9ydGlvbnNfbmV3ICU+JSBmaWx0ZXIoIXNpdGU9PVwiTEFVUlwiKVxuXG5Qcm9wb3J0aW9uX29mX0JvZHlfQ29uZGl0aW9uX1Njb3JlcyA8LSBnZ3Bsb3QoZGF0YT1kZl9iY3NfcHJvcG9ydGlvbnNfbmV3LCBhZXMoeD1tb250aCwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgK1xuICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PVwiaWRlbnRpdHlcIiwgcG9zaXRpb24gPSBcImZpbGxcIixjb2xvdXIgPSBcImJsYWNrXCIpKyAgXG4gICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpK1xuICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHZqdXN0ID0gMSwgaGp1c3Q9LjUpKStcbiAgbGFicyhmaWxsID1cIkJvZHkgQ29uZGl0aW9uIFNjb3Jlc1wiLCBlbGVtZW50X3RleHQoc2l6ZSA9IDEuNSkpK1xuICBsYWJzKHRpdGxlPVwiUHJvcG9ydGlvbiBvZiBCb2R5IENvbmRpdGlvbiBTY29yZXNcIiwgeCA9XCJtb250aFwiLCB5ID0gXCJQcm9wb3J0aW9uXCIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjApLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjApLCBhbmdsZSA9IDApKSsgXG4gIHRoZW1lKHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpK1xuICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKStcbnNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSBcIkJsdWVzXCIsIGRpcmVjdGlvbiA9IC0xKSsgI2NhbiB1c2UgcGFsZXR0ZSBcIlNwZWN0cmFsXCJcbiAgc2NhbGVfeF9jb250aW51b3VzKFwiTW9udGhcIiwgYnJlYWtzID0gYygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMikpKyBzY2FsZV9zaXplKGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMCkpKStcbiAgZmFjZXRfZ3JpZCh5ZWFyIH5zaXRlKStcbiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKSt0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcInJpZ2h0XCIpXG5cbiAgcHJpbnQoUHJvcG9ydGlvbl9vZl9Cb2R5X0NvbmRpdGlvbl9TY29yZXMpXG5gYGAifQ== -->

```r
# Proportion per month of intensity scores at three sites during 2023 & 2024 & 2025 & 2026
df_bcs_proportions_new <- rbind(df_BCS_proportions2023, df_BCS_proportions2024, df_BCS_proportions2025, df_BCS_proportions2026)

df_bcs_proportions_new<- df_bcs_proportions_new %>% filter(!site=="LAUR")

Proportion_of_Body_Condition_Scores <- ggplot(data=df_bcs_proportions_new, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill",colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+
  theme(axis.text.x = element_text(angle = 0, vjust = 1, hjust=.5))+
  labs(fill ="Body Condition Scores", element_text(size = 1.5))+
  labs(title="Proportion of Body Condition Scores", x ="month", y = "Proportion")+ theme(axis.title.y = element_text(size = rel(1.0), angle =90), axis.title.x = element_text(size = rel(1.0), angle = 0))+ 
  theme(title = element_text(size = 20))+
  theme(axis.text=element_text(size=12))+
scale_fill_brewer(palette = "Blues", direction = -1)+ #can use palette "Spectral"
  scale_x_continuous("Month", breaks = c(1,2,3,4,5,6,7,8,9,10,11,12))+ scale_size(element_text(size = rel(1.0)))+
  facet_grid(year ~site)+
  theme(strip.text = element_text(size = 15))+theme(legend.position = "right")

  print(Proportion_of_Body_Condition_Scores)

#Shell Pathology - all data #Includes 2023 data and all data that is in the 2024 format

shell_path <- list.files(path = "Lab_Data_TissueProcessing/raw_data/shell_pathology",                           # Identify all CSV files
 pattern = "*.csv", full.names = TRUE) %>% 
lapply(read_csv) %>%   # Store all files in list
  bind_rows          # Combine data sets into one data set 

shell_path <- shell_path %>% filter(!is.na(lab_id))

shell_path <- shell_path %>% select(-c("...14":"...26"))

write.csv(shell_path, "Master_files/shell_pathology_all_data.csv", row.names=FALSE)


#Writing summary for shell pathology

# Clean up, convert to integer, drop ID, etc.
shell_path_summary <- shell_path %>%
  # split `lab_id` into two parts
  separate(lab_id, into = c("Date_Site", "ID")) %>%
  # drop unwanted columns
  select(-pathology_notes, -ID) %>%
  # convert a set of logical (or whatever) columns to 0/1
  mutate(across(
    c(boring_sponge, polydora, conchiolin_mod_severe, mud_blister,
      pea_crab, gill_erosion, pale_digestive, discoloration,
      horn_add, cyst_abscess, tumor, oyster_drill,
      boring_snail, shell_scarring),
    ~ as.integer(as.logical(.))
  ))


# Compute a pathogen‐indicator sum *per sample* (row).
shell_path_summary <- shell_path_summary %>%
  mutate(
    Pathogen_count = rowSums(
      select(., boring_sponge, polydora, conchiolin_mod_severe, mud_blister,
             pea_crab, gill_erosion, pale_digestive, discoloration,
             horn_add, cyst_abscess, tumor, oyster_drill,
             boring_snail, shell_scarring),
      na.rm = TRUE
    )
  )

# Now group + summarise
shell_path_count <- shell_path_summary %>%
  group_by(Date_Site) %>%
  summarise(
    Sample_count = n(),
    across(
      c(boring_sponge, polydora, conchiolin_mod_severe, mud_blister,
        pea_crab, gill_erosion, pale_digestive, discoloration,
        horn_add, cyst_abscess, tumor, oyster_drill,
        boring_snail, shell_scarring, Pathogen_count),
      sum,
      na.rm = TRUE
    )
  ) %>%
  ungroup()

shell_path_count
shell_path_summary

write.csv(shell_path_count, "Lab_Data_TissueProcessing/output/shell_pathology_counts.csv", row.names=FALSE)
Preliminary Statistics on ALL body condition data

Individual site summaries and QAQC

Ash Creek Summary


df_ASHC<- data_all%>%
  filter(site=="ASHC")
df_ASHC

## Shell Height ##
st_height_ASHC <- summarySE(df_ASHC, measurevar="height_mm", groupvars=c("date_collected"))
st_height_ASHC

## Body Condition ##
#Excludes April and May due to scoring change. These months are scored categorically 'fat, medium, watery'. 

st_condition_ASHC<- summarySE(df_ASHC, measurevar = "condition_score", groupvars = c("date_collected"))
st_condition_ASHC

mean_condition_ASHC <- st_condition_ASHC %>%
  filter(!is.na(condition_score)) %>% # Filter out rows where condition_score is NA
  group_by(date_collected)%>%
  summarize(mean_bcs = mean(condition_score, na.rm = TRUE))
mean_condition_ASHC
ggplot(data=df_ASHC, aes(x=month, y=height_mm, group= month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title=" Ash Creek Mean Shell Height ", x ="month", y = "Mean Shell Height (mm)")+facet_wrap(.~year)
#Condition distribution across all sample months - 2023
df_ASHC_2023 <- df_ASHC%>%  filter(!year=="2024")

ASHC_BCS_dist2023 <-ggplot(data=df_ASHC_2023, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Ash Creek Body Condition Score - 2023", x ="Condition categorization")+
  facet_wrap(~ month, scales = "free")
ASHC_BCS_dist2023

#pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/ASHC_BCS_dist_2023.pdf"), height = 7, width = 13)
#print(ASHC_BCS_dist2023)
#dev.off()

#Condition distribution across all sample months - 2024
df_ASHC_2024 <- df_ASHC%>%  filter(!year=="2023")

ASHC_BCS_dist2024 <-ggplot(data=df_ASHC_2024, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Ash Creek Body Condition Score - 2024", x ="Condition categorization")+
  facet_wrap(~ month, scales = "free")
ASHC_BCS_dist2024

#pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/ASHC_BCS_dist_2024.pdf"), height = 7, width = 13)
#print(ASHC_BCS_dist2024)
#dev.off()

#Condition distribution across all sample months - 2025
df_ASHC_2025 <- df_ASHC%>%  filter(year=="2025")

ASHC_BCS_dist2025 <-ggplot(data=df_ASHC_2025, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Ash Creek Body Condition Score - 2025", x ="Condition categorization")+
  facet_wrap(~ month, scales = "free")
ASHC_BCS_dist2025

# pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/ASHC_BCS_dist_2025.pdf"), height = 7, width = 13)
# print(ASHC_BCS_dist2025)
# dev.off()

#Condition distribution across all sample months - 2026
df_ASHC_2026 <- df_ASHC%>%  filter(year=="2026")

ASHC_BCS_dist2026 <-ggplot(data=df_ASHC_2026, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Ash Creek Body Condition Score - 2026", x ="Condition categorization")+
  facet_wrap(~ month, scales = "free")
ASHC_BCS_dist2026

pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/ASHC_BCS_dist_2026.pdf"), height = 7, width = 13)
print(ASHC_BCS_dist2026)
dev.off()
#Mean Body condition per month
ggplot(data=df_ASHC, aes(x= month, y= condition_score, group = month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Ash Creek Mean Body Condition Score ", x ="month", y= " condition score (1-9)") + scale_y_reverse()+facet_wrap(.~year)

#ASHC Proportions graph Body condition scores - all years


ASHC_BCS_proportions<- df_ASHC %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%
  group_by(site, month, condition_score_bin, year) %>% dplyr::summarise(Count= n()) %>%
  ungroup() %>%
  mutate(Proportion = Count/sum(Count))

ASHC_BCS_proportions<- na.omit(ASHC_BCS_proportions)

ASHC_BCS_proportions

BCS_proportion_ASHC<- ggplot(data=ASHC_BCS_proportions, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
  labs(title="Ash Creek Proportion of body condition scores June- November", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  facet_wrap(~ year)
 #scale_fill_brewer() +
  #facet_wrap(~ site)

BCS_proportion_ASHC
  
pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/ASHC_BCS_proportion.pdf"), height = 7, width = 13)
print(BCS_proportion_ASHC)
dev.off()

% of scores >3 at ash creek - all years

df_ASHC

ASHC_percent_greater_3 <- df_ASHC %>%
  dplyr::group_by(month, site, year) %>%
  dplyr::summarise(Percentage = mean(condition_score <= 3)*100)
ASHC_percent_greater_3

ASHC_BCS_percentage <- ASHC_percent_greater_3%>% 
  #filter(year =="2024")%>%
  ggplot(aes(x = month, y = Percentage)) +
  #geom_bar(width = 0.5, stat = "identity", position = "fill") +
    geom_col()+
  theme_bw() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
    axis.title.y = element_text(size = rel(1.3), angle = 90),
    axis.title.x = element_text(size = rel(1.3), angle = 0),
    axis.text = element_text(size = 12)
  ) +
  labs(
    title = "Ash Creek % of body condition scores >= 3",
    x = "month",
    y = "Percentage of body condition scores >= 3"
  ) +
    facet_wrap(~year)
  #scale_x_continuous( breaks = seq(5,12, by =1) )+
  #ylim(0,60)+ 
  #scale_y_continuous(limits = c(0,100), breaks = seq(0,100, by = 10))
ASHC_BCS_percentage

pdf(paste0(path = "Lab_Data_TissueProcessing/output", "/ASHC_BCS_percentage.pdf"),height = 7, width = 13)
print(ASHC_BCS_percentage)
dev.off() 

Fence Creek Summary

df_FENC<- data_all%>%
  filter(site=="FENC")
df_FENC

## Shell Height ##
st_height_FENC <- summarySE(df_FENC, measurevar="height_mm", groupvars=c("date_collected"))
st_height_FENC 

## Body Condition ##
#Excludes April and May due to scoring change. These months are scored categorically 'fat, medium, watery'. 

st_condition_FENC<- summarySE(df_FENC%>% filter(!is.na(condition_score)), measurevar = "condition_score", groupvars = c("date_collected"))
st_condition_FENC
ggplot(data=df_FENC, aes(x=month, y=height_mm, group=month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title=" Fence Creek Mean Shell Height ", x ="month", y = "Mean Shell Height (mm)")+ facet_wrap(.~year)
#Condition distribution across all sample months - 2023
df_FENC.2023 <- df_FENC%>%  filter(!year=="2024")

ggplot(data=df_FENC.2023, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Fence Creek Body Condition index - 2023", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")

#Condition distribution across all sample months - 2024
df_FENC.2024 <- df_FENC%>%  filter(year=="2024")

ggplot(data=df_FENC.2024, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Fence Creek Body Condition index - 2024", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")

#Condition distribution across all sample months - 2025
df_FENC.2025 <- df_FENC%>%  filter(year=="2025")

ggplot(data=df_FENC.2025, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Fence Creek Body Condition index - 2025", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")

#Condition distribution across all sample months - 2026
df_FENC.2026 <- df_FENC%>%  filter(year=="2026")

ggplot(data=df_FENC.2026, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Fence Creek Body Condition index - 2026", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")


#Mean Body condition per month
ggplot(data=df_FENC, aes(x= month, y= condition_score, group = month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Fence Creek Mean Body Condition Score", x ="month", y= " condition score (1-9)")+ scale_y_reverse() + facet_wrap(~ year, scales = "free")

#FENC Proportions graph Body condition scores - all years


FENC_BCS_proportions<- df_FENC %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%
  group_by(site, month, condition_score_bin, year) %>% dplyr::summarise(Count= n()) %>%
  ungroup() %>%
  mutate(Proportion = Count/sum(Count))

FENC_BCS_proportions<- na.omit(FENC_BCS_proportions)

FENC_BCS_proportions

BCS_proportion_FENC<- ggplot(data=FENC_BCS_proportions, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
  labs(title="Fence Creek Proportion of body condition scores", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
  facet_wrap(~ year)
 #scale_fill_brewer() +
  #facet_wrap(~ site)

BCS_proportion_FENC
  
pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/FENC_BCS_proportion.pdf"), height = 7, width = 13)
print(BCS_proportion_FENC)
dev.off()

% of scores >3 at Fence Creek - all years

#removing 0823FENC_28 bcs was NA
df_FENC <- df_FENC %>% drop_na(condition)

FENC_percent_greater_3 <- df_FENC %>%
  dplyr::group_by(month, year) %>%
  dplyr::summarise(Percentage = mean(condition_score <= 3)*100)
FENC_percent_greater_3

FENC_BCS_percentage <- FENC_percent_greater_3 %>%
  filter(year =="2025")%>%
  ggplot(aes(x = month, y = Percentage)) +
  #geom_bar(width = 0.5, stat = "identity", position = "fill") +
    geom_col()+
  theme_bw() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
    axis.title.y = element_text(size = rel(1.3), angle = 90),
    axis.title.x = element_text(size = rel(1.3), angle = 0),
    axis.text = element_text(size = 12)
  ) +
  labs(
    title = "Fence Creek % of body condition scores >= 3",
    x = "month",
    y = "Percentage of body condition scores >= 3"
  ) +
    facet_wrap(~year)
  #scale_x_continuous( breaks = seq(5,12, by =1) )+
  #ylim(0,60)+ 
  #scale_y_continuous(limits = c(0,100), breaks = seq(0,100, by = 10))
FENC_BCS_percentage

pdf(paste0(path = "Lab_Data_TissueProcessing/output", "/FENC_BCS_percentage.pdf"),height = 7, width = 13)
print(FENC_BCS_percentage)
dev.off() 

Gold Star Beach Summary

0524GOLD has 46 samples - we attempted to sample from 2022 and 2023 planting and consider them seperate but it appeared that due to a storm the plantings mixed together.

No samples collected for October & November at Gold Star in 2025 due to federal government lapse in appropriation.

1225GOLD has 9 samples - due to inablility to collect enough samples in unfavorable conditions.

df_GOLD<- data_all%>%
  filter(site=="GOLD")
df_GOLD <- df_GOLD %>% filter(!is.na(height_mm))

#2023 data
df_GOLD2023 <- df_GOLD%>%  filter(!year=="2024")

#2024 data
df_GOLD2024 <- df_GOLD%>%  filter(!year=="2023")

df_GOLD$height_mm<-as.numeric(df_GOLD$height_mm)

mean_shell_height <- df_GOLD %>% mutate(year = year(date_collected)) %>% group_by(year)%>% dplyr::summarise(mean_height = mean(height_mm)) #summarySE(measurevar="height_mm", groupvars=c("year"))
mean_shell_height

## Shell Height ##
st_height_GOLD <- summarySE(df_GOLD, measurevar="height_mm", groupvars=c("date_collected"))
st_height_GOLD 

## Body Condition ##
st_condition_GOLD<- summarySE(df_GOLD, measurevar = "condition_score", groupvars = c("date_collected"))
st_condition_GOLD

#GOLD Proportions graph Body condition scores


GOLD_BCS_proportions<- df_GOLD %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%
  group_by(site, month, year, condition_score_bin) %>% dplyr::summarise(Count= n()) %>%
  ungroup() %>%
  mutate(Proportion = Count/sum(Count))

GOLD_BCS_proportions<- na.omit(GOLD_BCS_proportions)

BCS_proportion_GOLD <- ggplot(data=GOLD_BCS_proportions, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
  labs(title="Gold Star Beach Proportion of body condition scores", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))+
scale_fill_brewer(palette = "Blues", direction = -1)+
  facet_wrap(~ year)
BCS_proportion_GOLD


  
pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/GOLD_BCS_proportion.pdf"), height = 7, width = 13)
print(BCS_proportion_GOLD)
dev.off()

% of scores >3 at gold june - november

df_GOLD

GOLD_percent_greater_3 <- df_GOLD %>%
  dplyr::group_by(month, year) %>%
  dplyr::summarise(Percentage = mean(condition_score <= 3)*100)
GOLD_percent_greater_3

GOLD_BCS_percentage <- GOLD_percent_greater_3 %>%
  ggplot(aes(x = month, y = Percentage)) +
  #geom_bar(width = 0.5, stat = "identity", position = "fill") +
    geom_col()+
  theme_bw() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
    axis.title.y = element_text(size = rel(1.3), angle = 90),
    axis.title.x = element_text(size = rel(1.3), angle = 0),
    axis.text = element_text(size = 12)
  ) +
  labs(
    title = "Gold Star Beach % of body condition scores >= 3",
    x = "month",
    y = "Percentage of body condition scores >= 3"
  ) +facet_wrap(~year) +
  #scale_x_continuous( breaks = seq(5,12, by =1) )+
  #ylim(0,100)+ 
  scale_y_continuous(limits = c(0,100), breaks = seq(0,100, by = 10)) 

    
GOLD_BCS_percentage

pdf(paste0(path = "Lab_Data_TissueProcessing/output", "/GOLD_BCS_percentage.pdf"),height = 7, width = 13)
print(GOLD_BCS_percentage)
dev.off() 
ggplot(data=df_GOLD, aes(x=month, y=height_mm, group= month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Goldstar Beach Mean Shell Height ", x ="month", y = "Mean Shell Height (mm)") + #scale_x_continuous(limits= c(4,11), breaks = seq(5,10, by =1))+
  geom_smooth(method = "lm", se = FALSE)+ facet_wrap(~year)
#Condition distribution across all sample months - 2023
ggplot(data=df_GOLD2023, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Goldstar Beach  Body Condition Score - 2023 ", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")

#Condition distribution across all sample months - 2024
ggplot(data=df_GOLD2024, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Goldstar Beach  Body Condition Score - 2024", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")

#Mean Body condition per month
ggplot(data=df_GOLD, aes(x= month, y= condition_score, group = month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  labs(title="Goldstar Beach  Mean Body Condition Score ", x ="month", y= " condition score (1-9)")+ scale_y_reverse() + facet_wrap(~year)
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+

Laurel Hollow Summary - NO LONGER A STUDY SITE

df_LAUR<- data_all%>%
  filter(site=="LAUR")

## Shell Height ##
st_height_LAUR <- summarySE(df_LAUR, measurevar="height_mm", groupvars=c("date_collected"))
st_height_LAUR 

## Body Condition ##
## Excludes May due to scoring system change. May scored fat, medium, watery. 
st_condition_LAUR<- summarySE(df_LAUR, measurevar = "condition_score", groupvars = c("date_collected"))
st_condition_LAUR
ggplot(data=df_LAUR, aes(x=month, y=height_mm, group= month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title=" Laurel Hollow Mean Shell Height - 2023", x ="month", y = "Mean Shell Height (mm)")
#Condition distribution across all sample months
ggplot(data=df_LAUR, aes(x= condition)) +
  geom_bar()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  labs(title="Laurel Hollow Body Condition index - 2023", x ="Condition categorization")+
    facet_wrap(~ month, scales = "free")


#Mean Body condition per month
ggplot(data=df_LAUR, aes(x= month, y= condition_score, group = month)) +
  geom_boxplot()+  #scale_fill_manual(values=c("forestgreen","orange", "purple"))+
  theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  labs(title="Laurel Hollow Mean Body Condition Score - 2023", x ="month", y= " condition score (1-9)")+ scale_y_reverse()
  #theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+

#LAUR Proportions graph Body condition scores - 2023 (only sampled one year)


LAUR_BCS_proportions<- df_LAUR %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%
  group_by(site, month, condition_score_bin, year) %>% dplyr::summarise(Count= n()) %>%
  ungroup() %>%
  mutate(Proportion = Count/sum(Count))

LAUR_BCS_proportions<- na.omit(LAUR_BCS_proportions)

LAUR_BCS_proportions

BCS_proportion_LAUR<- ggplot(data=LAUR_BCS_proportions, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill")+  
   theme_bw() +  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))+
  labs(title="Laurel Hollow Proportion of body condition scores - 2023", x ="month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.3), angle =90), axis.title.x = element_text(size = rel(1.3), angle = 0))+
  theme(axis.text=element_text(size=12))
  #facet_wrap(~ year)
 #scale_fill_brewer() +
  #facet_wrap(~ site)

BCS_proportion_LAUR
  
pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/LAUR_BCS_proportion.pdf"), height = 7, width = 13)
print(BCS_proportion_LAUR)
dev.off()

% of scores >3 at LAUR june - november


#removing 0823FENC_28 bcs was NA
df_LAUR. <- df_LAUR%>%filter(!row_number() %in% c(2))

LAUR_percent_greater_3 <- df_LAUR. %>%
  dplyr::group_by(month, site, year) %>%
  dplyr::summarise(Percentage = mean(condition_score <= 3)*100)
LAUR_percent_greater_3

LAUR_BCS_percentage <- LAUR_percent_greater_3 %>%
  ggplot(aes(x = month, y = Percentage)) +
  #geom_bar(width = 0.5, stat = "identity", position = "fill") +
    geom_col()+
  theme_bw() +
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
    axis.title.y = element_text(size = rel(1.3), angle = 90),
    axis.title.x = element_text(size = rel(1.3), angle = 0),
    axis.text = element_text(size = 12)
  ) +
  labs(
    title = "Gold Star Beach % of body condition scores >= 3",
    x = "month",
    y = "Percentage of body condition scores >= 3"
  ) #+facet_wrap(~year)
  #+ scale_x_continuous( breaks = seq(5,12, by =1) )+
  #ylim(0,60)+ 
  #scale_y_continuous(limits = c(0,100), breaks = seq(0,100, by = 10)) 

    
LAUR_BCS_percentage

pdf(paste0(path = "Lab_Data_TissueProcessing/output", "/LAUR_BCS_percentage.pdf"),height = 7, width = 13)
print(LAUR_BCS_percentage)
dev.off() 
#Coding graphs for LIS Conference - only 2023 data
data_2023 <- data_all%>%  filter(!year=="2024")

df_BCS_proportions<- data_2023 %>%
  mutate(condition_score_numeric = as.numeric(condition_score),condition_score_bin = case_when(condition_score == 1 ~ "1", condition_score == 2 ~"2",condition_score == 3 ~ "3", condition_score == 4 ~"4",condition_score == 5 ~ "5", condition_score == 6 ~"6",condition_score == 7 ~ "7", condition_score == 8 ~"8", condition_score ==9 ~"9", TRUE ~ as.character(condition_score))) %>%
  group_by(site, month, condition_score_bin) %>% dplyr ::summarise(Count= n()) %>%
  ungroup() %>%
  mutate(Proportion = Count/sum(Count))

df_BCS_proportions<- na.omit(df_BCS_proportions)

df_BCS_proportions$month <- factor(df_BCS_proportions$month, levels = c("5","6","7", "8", "9", "10", "11"),
        labels=c("May", "June", "July", "Aug", "Sept", "Oct", "Nov"))
df_BCS_proportions$site <- factor(df_BCS_proportions$site, levels = c("ASHC","FENC","GOLD", "LAUR"),
        labels=c("Ash Creek", "Fence Creek", "Gold Star", "Laurel Hollow"))

bcs.prop.2023 <- ggplot(data=df_BCS_proportions, aes(x=month, y= Proportion, fill=condition_score_bin)) +
  geom_bar(width = .5, stat="identity", position = "fill", colour = "black")+  
   theme_bw() +  theme(panel.grid.minor = element_blank())+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1, size = rel(.9)))+
  theme(panel.grid.major.x =element_blank())+
  labs(title="Body condition scores in 2023", x ="Month", y = "Proportion of body condition scores ")+ theme(axis.title.y = element_text(size = rel(1.2), angle =90), axis.title.x = element_text(size = rel(1.2), angle = 0))+ scale_fill_brewer(palette = "Blues") +
  theme(strip.text = element_text(size = 15))+
  theme (legend.title = element_text(size = 18))+
  theme(title = element_text(size = 17))+
  theme(axis.text=element_text(size=17))+
  labs(fill ="Body Condition Score")+
  facet_wrap(~ site )
bcs.prop.2023

#pdf(paste0(path = "Lab_Data_TissueProcessing/output" ,"/BCS_proportion_2023.pdf"), height = 7, width = 13)
#print(bcs.prop.2023)
#dev.off()

#BCS_proportion_all+scale_fill_manual(values = c("#003C30","#01665E","#80CDC1","#C7EAE5","#F6E8C3","#DFC27D","#BF812D", "#8C510A","#543005" ))
#scale_fill_manual(values = c("#003C30","#01665E","#80CDC1","#C7EAE5","azure1","slategray1","slategray3", "slategray4", "gray25" )) 

f <- function(pal) brewer.pal(brewer.pal.info[pal, "maxcolors"], pal)
(cols <- f("YlGnBu"))
#Coding graphs for LIS Conference - only 2023 data (continued)

df_3_prop<- select(data_2023, -c("site"))

#Count and proportion table for 2023 bcs scores by month
bcs_table <- table(data_2023$condition_score, data_2023$month, data_2023$site)
names(dimnames(bcs_table)) <- c("Body Condition Score", "Month", "Site")
bcs_table <- addmargins(bcs_table)
bcs_table
sessionInfo()

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIkxJUyBPeXN0ZXIgTGFiIFRpc3N1ZSBQcm9jZXNzaW5nIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpBdXRob3IgOiBNYXJpYWggS2FjaG1hcg0KZGVzY3JpcHRpb246IFRoaXMgUiBjb2RlIGlzIHVzZWQgdG8gaW1wb3J0IGFuZCBzdW1tYXJpemUgdGlzc3VlIHByb2Nlc3NpbmcgZGF0YSAoYm9keSBjb25kaXRpb24sIGhlaWdodC9sZW5ndGgvd2lkdGgsIHdlaWdodCwgc2FtcGxlIGNvbGxlY3Rpb24pIGZyb20gdGhlIExJU1MgT3lzdGVyIEhlYWx0aCBQcm9qZWN0J3MgbW9udGhseSBzYW1wbGluZyBhdCBBc2ggQ3JlZWsgYW5kIEZlbmNlIENyZWVrIGludGVydGlkYWwgc2l0ZXMgaW4gQ29ubmVjdGljdXQgYW5kIEdvbGRzdGFyIGJlYWNoIGFuZCBMYXVyZWwgSG9sbG93IHN1YnRpZGFsIHNpdGVzIG9uIExvbmcgSXNsYW5kLCBOWS4gDQotLS0NCg0KVXBkYXRlZCAxLzE1LzIwMjUgYnkgSy5MZW5kZXJtYW4NCiAtIGRhdGEgY2hlY2sNCiAtIGFkZGVkIG5ldyBjb2RlIGZvciAyMDI2IGRhdGENCiANCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KI2tuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCiNrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICdDOi9Vc2Vycy9tYXJpYWgua2FjaG1hci9kb2N1bWVudHMvR2l0aHViL0VBRC1BU0VCX0VQQV9MSVNTX0Rpc2Vhc2VfU3VydmVpbGxhbmNlJykgI01hcmlhaCdzDQoja25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnQzovVXNlcnMva3lyYS5sZW5kZXJtYW4vZG9jdW1lbnRzL0dpdGh1Yi9FQUQtQVNFQl9FUEFfTElTU19EaXNlYXNlX1N1cnZlaWxsYW5jZScpICNLeXJhJ3MNCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gJ0M6L1VzZXJzL3NhcmluYS5kZXJ5L2RvY3VtZW50cy9HaXRodWIvRUFELUFTRUJfRVBBX0xJU1NfRGlzZWFzZV9TdXJ2ZWlsbGFuY2UnKQ0KYGBgDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkoImdncGxvdDIiKQ0KbGlicmFyeSgicmVhZHhsIikNCmxpYnJhcnkoInBseXIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxpYnJhcnkoImRwbHlyIikNCmxpYnJhcnkoIlJtaXNjIikNCmxpYnJhcnkoInJlYWRyIikgIA0KbGlicmFyeSgibHVicmlkYXRlIikNCmxpYnJhcnkoInB1cnJyIikNCmxpYnJhcnkoInJlc2hhcGUyIikNCmxpYnJhcnkoInN0cmluZ3IiKQ0KbGlicmFyeSgiUkNvbG9yQnJld2VyIikNCmxpYnJhcnkoInRpZHlyIikNCmBgYA0KDQoNCg0KDQojIyMgVGhpcyBjb2RlIGNodW5rIG1lcmdlcyBhbGwgLmNzdiBmaWxlcyB3aXRoaW4gdGhlIFRpc3N1ZSBwcm9jZXNzaW5nIGZvbGRlciBpbnRvIG9uZSBkYXRhIGZyYW1lIGFuZCBvdXRwdXRzIHRoZSBmdWxsIGRhdGFzZXQgaW50byBhIC5jc3YgbWFzdGVyIGZpbGUuIFRoaXMgYWxsb3dzIHVzIHRvIGRvd25sb2FkIHRoZSByYXcgZGF0YSBhcyBhIC5jc3YsIGFkZCBpdCB0byB0aGUgcmVwb3NpdG9yeSBmb2xkZXIsIGFuZCBjcmVhdGUgdGhlIG1hc3RlciBkYXRhIGZpbGUgd2l0aG91dCBjb3B5aW5nIGFuZCBwYXN0aW5nIGRhdGEgaW4gZXhjZWwuDQojIHJlYWRpbmcgaW4gLmNzdiBmaWxlcyBmcm9tIGxvY2FsIGZvbGRlcg0KYGBge3J9DQoNCiNkYXRhX2FsbCA8LSBsaXN0LmZpbGVzKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9yYXdfZGF0YS9GaWxlc19ieV9Nb250aCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZGVudGlmeSBhbGwgQ1NWIGZpbGVzDQojIHBhdHRlcm4gPSAiKi5jc3YiLCBmdWxsLm5hbWVzID0gVFJVRSkgJT4lIA0KI2xhcHBseShyZWFkX2NzdikgJT4lICAgIyBTdG9yZSBhbGwgZmlsZXMgaW4gbGlzdA0KIyAgYmluZF9yb3dzICAgICAgICAgICMgQ29tYmluZSBkYXRhIHNldHMgaW50byBvbmUgZGF0YSBzZXQgDQojZGF0YV9hbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHJpbnQgZGF0YSB0byBSU3R1ZGlvIGNvbnNvbGUNCg0KDQojYXMuZGF0YS5mcmFtZShkYXRhX2FsbCkgICMgQ29udmVydCB0aWJibGUgdG8gZGF0YS5mcmFtZQ0KDQoNCiNGaWx0ZXJpbmcgTkFzIGFuZCB1bm5lY2Vzc2FyeSBjb2x1bW5zDQojZGF0YV9hbGwgPC0gZGF0YV9hbGwgJT4lIGZpbHRlcighaXMubmEoZGF0ZV9jb2xsZWN0ZWQpKQ0KI2RhdGFfYWxsIDwtIHNlbGVjdChkYXRhX2FsbCwgLWxpZ2h0X3JlZ2ltZSwgLW95c3Rlcl96b25lKQ0KDQoNCiN3cml0ZS5jc3YoZGF0YV9hbGwsICJNYXN0ZXJfZmlsZXMvdGlzc3VlX3Byb2Nlc3NpbmdfYWxsX2RhdGEuY3N2Iiwgcm93Lm5hbWVzPUZBTFNFKQ0KDQoNCg0KDQojIyMjIyBVU0UgVEhJUyBDT0RFIFRPIE1FUkdFIERBVEEgRklMRVMgLSBzb21lIG9mIHRoZSBmaWxlcyBoYXZlIGNvbHVtbnMgdGhhdCBhcmUgbm90IHRoZSBzYW1lIGZvcm1hdCAoZGF0ZXMgc3BlY2lmaWNhbGx5KSwgd2hpY2ggd2FzIGNhdXNpbmcgaXNzdWVzIGluIG1lcmdpbmcuIFRoaXMgY29kZSBiZWxvdyBzaG91bGQgc29sdmUgdGhhdCBwcm9ibGVtLiBJdCBjb252ZXJ0cyBhbGwgZGF0ZSBjb2x1bW5zIHRvIGRhdGVzIGFuZCBtL2QveSBmb3JtYXQgIyMjIyMNCg0KDQoNCmZpbGVfcGF0aHMgPC0gbGlzdC5maWxlcyhwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3NpbmcvcmF3X2RhdGEvRmlsZXNfYnlfTW9udGgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiouY3N2IiwgZnVsbC5uYW1lcyA9IFRSVUUpDQoNCg0KZGF0YV9hbGwgPC0gbGFwcGx5KGZpbGVfcGF0aHMsIGZ1bmN0aW9uKGZpbGVfcGF0aCkgew0KICByZWFkX2NzdihmaWxlX3BhdGgpICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGRhdGVfY29sbGVjdGVkID0gYXMuRGF0ZShkYXRlX2NvbGxlY3RlZCxmb3JtYXQgPSAiJW0vJWQvJVkiKSwNCiAgICAgIGRhdGVfcHJvY2Vzc2VkID0gYXMuRGF0ZShkYXRlX3Byb2Nlc3NlZCxmb3JtYXQgPSAiJW0vJWQvJVkiKSwNCiAgICAgIGRhdGVfZGF2aWRzb25zID0gYXMuRGF0ZShkYXRlX2Rhdmlkc29ucyxmb3JtYXQgPSAiJW0vJWQvJVkiKSwNCiAgICAgIGRhdGVfZXRvaCA9IGFzLkRhdGUoZGF0ZV9ldG9oLGZvcm1hdCA9ICIlbS8lZC8lWSIpDQogICAgKQ0KfSkgJT4lDQogIGJpbmRfcm93cw0KYXMuZGF0YS5mcmFtZShkYXRhX2FsbCkgICMgQ29udmVydCB0aWJibGUgdG8gZGF0YS5mcmFtZQ0KDQpkYXRhX2FsbCA8LSBkYXRhX2FsbCAlPiUgZmlsdGVyKCFpcy5uYShkYXRlX2NvbGxlY3RlZCkpDQpkYXRhX2FsbCA8LSBzZWxlY3QoZGF0YV9hbGwsIC1saWdodF9yZWdpbWUsIC1veXN0ZXJfem9uZSkNCg0KDQpkYXRhX2FsbA0KDQoNCg0KYGBgDQoNCiNBIHdyb25nIHZhbHVlIGNhbGlwZXIgaW5wdXQgd2FzIGlkZW50aWZpZWQgZm9yIHRoZSBoZWlnaHQgb2Ygc2FtcGxlIDA5MjNHT0xEXzIzLiBUaGlzIGNvZGUgaXMgcmVtb3ZpbmcgdGhhdCB2YWx1ZSBmcm9tIHRoZSBkYXRhIHNldCBhcyB3ZSBjYW5ub3QgY29uY2x1ZGUgd2hhdCB0aGlzIG9yaWdpbmFsIHZhbHVlIHdhcy4gVGhlIHZhbHVlIGlzIDguNjIuIFRoaXMgd2lsbCBjYXVzZSB0aGlzIGluZGl2aWR1YWwgdG8gZmFsbCBvdXQgb2YgdGhlIGRhdGFzZXQgd2hlbiBzdGFuZGFyZGl6ZWQgdG8gbGVuZ3RoLiBUaGlzIGNvZGUgZG9lcyBub3QgY29tcGxldGVseSByZW1vdmUgdGhlIGluZGl2aWR1YWwgZnJvbSB0aGUgZGF0YXNldC4NCmBgYHtyfQ0KZGF0YV9hbGwkaGVpZ2h0X21tW2RhdGFfYWxsJGhlaWdodF9tbSA9PSAiMCJdIDwtIE5BDQpgYGANCg0KIyMgYWRkaW5nIGEgbW9udGggJiB5ZWFyIGNvbHVtbiB0byB0aGUgZGF0YQ0KDQpgYGB7cn0NCmRhdGFfYWxsIDwtIGRhdGFfYWxsICU+JSBkcGx5cjo6bXV0YXRlKGRhdGVfY29sbGVjdGVkPSBhcy5EYXRlKGRhdGVfY29sbGVjdGVkKSwgbW9udGggPSBtb250aChkYXRlX2NvbGxlY3RlZCkpDQoNCmRhdGFfYWxsIDwtIGRhdGFfYWxsICU+JSBkcGx5cjo6bXV0YXRlKGRhdGVfY29sbGVjdGVkPSBhcy5EYXRlKGRhdGVfY29sbGVjdGVkKSwgeWVhciA9IHllYXIoZGF0ZV9jb2xsZWN0ZWQpKQ0KDQojY2hhbmdpbmcgbnVtZXJpYyBtb250aCB0byBtb250aCBuYW1lDQpkYXRhX2FsbCRtb250aCA8LSBmYWN0b3IoZGF0YV9hbGwkbW9udGgsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCAiOCIsICI5IiwgIjEwIiwgIjExIiwgIjEyIiksDQogICAgICAgIGxhYmVscz1jKCJKYW4iLCJGZWIiLCAiTWFyY2giLCJBcHJpbCIsIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVnIiwgIlNlcHQiLCAiT2N0IiwgIk5vdiIsICJEZWMiKSkNCg0KZGF0YV9hbGwNCmBgYA0KDQojIFRoaXMgY2h1bmsgb2YgY29kZSBjcmVhdGVzIGEgbnVtZXJpY2FsIHZhbHVlIGluIGEgbmV3IGNvbHVtbiBmb3IgdGhlIGJvZHkgY29uZGl0aW9uIHNjb3Jlcw0KYGBge3J9DQoNCmRhdGFfYWxsPC0gZGF0YV9hbGwgJT4lDQogZHBseXI6Om11dGF0ZShjb25kaXRpb25fc2NvcmUgPSByZWNvZGUoY29uZGl0aW9uLCAiMV92ZXJ5X2dvb2QiID0gMSwgIjJfZ29vZCIgPSAyLCAiM19nb29kX21pbnVzIj0gMywgIjRfZmFpcl9wbHVzIj0gNCwgIjVfZmFpciI9IDUsIjZfZmFpcl9taW51cyI9NiwiN19wb29yX3BsdXMiPTcsICI4X3Bvb3IiPSA4LCAiOV92ZXJ5X3Bvb3IiPSA5KSkNCmhlYWQoZGF0YV9hbGwpDQoNCmBgYA0KI1RoaXMgY2h1bmsgb2YgY29kZSBpcyByZW1vdmluZyAwNzIzTEFVUl8yMCBhbmQgMDcyM0xBVVJfMjYgZnJvbSB0aGUgZGF0YXNoZWV0IGFzIHRoZXkgaGF2ZSBiZWVuIGlkZW50aWZpZWQgYXMgc3BhdCBvbiBzaGVsbCB0byBhdm9pZCBiaWFzIGluIHRoZSBkYXRhLiBEdXJpbmcgdGhpcyBzYW1wbGUgY29sbGVjdGlvbiB0aGVyZSB3ZXJlIGFuaW1hbHMgdGhhdCB3ZXJlIHNpZ25pZmljYW50bHkgc21hbGxlciB0aGFuIHRoZSBzaW5nbGUgc2V0IG95c3RlcnMuIFRoZXNlIGluZGl2aWR1YWxzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWxsIG1vbnRobHkgc2FtcGxpbmcgcmVsYXRlZCBkYXRhc2hlZXRzIGluY2x1ZGluZyBkaXNlYXNlIGFuYWx5c2lzLiBBbGwgdGlzc3VlIGFtcGxlcyB3aWxsIGJlIGRpc2dhcmRlZC4gDQpgYGB7cn0NCmRhdGFfYWxsIDwtIGRhdGFfYWxsICU+JQ0KICBzdWJzZXQobGFiX2lkICE9ICIwNzIzTEFVUl8yMCIpICU+JQ0KICBzdWJzZXQobGFiX2lkICE9ICIwNzIzTEFVUl8yNiIpDQoNCmRhdGFfYWxsDQoNCmBgYA0KDQojIFN1bW1hcnkgb2YgYWxsIGRhdGEgLSBoZWlnaHQNCmBgYHtyfQ0Kc3RfaGVpZ2h0IDwtIHN1bW1hcnlTRShkYXRhX2FsbCU+JSBmaWx0ZXIoIWlzLm5hKGhlaWdodF9tbSkpLCBtZWFzdXJldmFyPSJoZWlnaHRfbW0iLCBncm91cHZhcnM9Yygic2l0ZSIsICJkYXRlX2NvbGxlY3RlZCIpKQ0KDQpzdF9oZWlnaHQgDQoNCiNDYWxjdWxhdGUgY29tcGxldGVuZXNzIGZvciBRQw0Kc3RfaGVpZ2h0JENvbXBsZXRlbmVzcyA8LSBzdF9oZWlnaHQkTiAvMzANCg0Kc3RfaGVpZ2h0DQoNCndyaXRlLmNzdihzdF9oZWlnaHQsICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dFxcQ29tcGxldGVuZXNzX3Rpc3N1ZV9wcm9jZXNzaW5nX2RhdGEuY3N2Iiwgcm93Lm5hbWVzPUZBTFNFKQ0KYGBgDQojTWVhbiBIZWlnaHQNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZGF0YV9hbGwsIGFlcyh4PXNpdGUsIHk9aGVpZ2h0X21tLCBmaWxsPXNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpKyAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJmb3Jlc3RncmVlbiIsIm9yYW5nZSIsICJwdXJwbGUiKSkrDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iTWVhbiBTaGVsbCBIZWlnaHQgIiwgeCA9InNpdGUiLCB5ID0gIk1lYW4gU2hlbGwgSGVpZ2h0IChtbSkiKSArIGZhY2V0X3dyYXAoLn55ZWFyKQ0KYGBgDQoNCg0KDQojQm9keSBjb25kaXRpb24NCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZGF0YV9hbGwsIGFlcyh4PXNpdGUsIHk9Y29uZGl0aW9uX3Njb3JlLCBmaWxsPXNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpKyAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJmb3Jlc3RncmVlbiIsIm9yYW5nZSIsICJwdXJwbGUiKSkrDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iTWVhbiBDb25kaXRpb24gU2NvcmUgIiwgeCA9InNpdGUiLCB5ID0gIk1lYW4gQm9keSBDb25kaXRpb24gU2NvcmUiKSsgc2NhbGVfeV9yZXZlcnNlKCkrIGZhY2V0X3dyYXAoLn55ZWFyKQ0KYGBgDQoNCmBgYHtyfQ0KDQptZWFuX2JvZHlfY29uZGl0aW9uIDwtIGRhdGFfYWxsICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc2l0ZSwgbW9udGgsIHllYXIpJT4lDQogIGRwbHlyOjpzdW1tYXJpemUobWVhbl9ic2MgPSBtZWFuKGNvbmRpdGlvbl9zY29yZSwgbmEucm0gPSBUUlVFKSkNCm1lYW5fYm9keV9jb25kaXRpb24NCg0KI2ZvciBvdmVybGF5IGdyYXBoDQojbWVhbl9iY3NfYXNoYyA8LSBtZWFuX2JvZHlfY29uZGl0aW9uICU+JQ0KICAjZmlsdGVyKHNpdGUgPT0gIkFTSEMiKSAlPiUNCiAgI2ZpbHRlcih5ZWFyID09ICIyMDI0IikNCg0KI01lYW4gYm9keSBjb25kdGlvbiBzY29yZXMgLSAyMDIzDQpkYXRhXzIwMjMgPC0gZGF0YV9hbGwlPiUgIGZpbHRlcih5ZWFyPT0iMjAyMyIpDQogIA0KZ2dwbG90KGRhdGE9ZGF0YV8yMDIzLCBhZXMoeD1tb250aCwgeT1jb25kaXRpb25fc2NvcmUsIGdyb3VwID0gbW9udGgsIGZpbGwgPSBzaXRlKSkgKw0KICBnZW9tX2JveHBsb3QoKSsgDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC0zNSwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iTWVhbiBDb25kaXRpb24gU2NvcmUgLSAyMDIzIiwgeCA9Im1vbnRoIiwgeSA9ICJNZWFuIEJvZHkgQ29uZGl0aW9uIFNjb3JlIikrIHNjYWxlX3lfcmV2ZXJzZSgpK2ZhY2V0X3dyYXAofnNpdGUpDQoNCiNNZWFuIGJvZHkgY29uZHRpb24gc2NvcmVzIC0gMjAyNA0KZGF0YV8yMDI0IDwtIGRhdGFfYWxsJT4lICBmaWx0ZXIoeWVhcj09IjIwMjQiKQ0KICANCmdncGxvdChkYXRhPWRhdGFfMjAyNCwgYWVzKHg9bW9udGgsIHk9Y29uZGl0aW9uX3Njb3JlLCBncm91cCA9IG1vbnRoLCBmaWxsID0gc2l0ZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkrIA0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtMzUsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9Ik1lYW4gQ29uZGl0aW9uIFNjb3JlIC0gMjAyNCIsIHggPSJtb250aCIsIHkgPSAiTWVhbiBCb2R5IENvbmRpdGlvbiBTY29yZSIpKyBzY2FsZV95X3JldmVyc2UoKStmYWNldF93cmFwKH5zaXRlKQ0KDQojTWVhbiBib2R5IGNvbmRpdGlvbiBzY29yZXMgLSAyMDI1DQpkYXRhXzIwMjUgPC0gZGF0YV9hbGwlPiUgIGZpbHRlcih5ZWFyPT0iMjAyNSIpDQogIA0KZ2dwbG90KGRhdGE9ZGF0YV8yMDI1LCBhZXMoeD1tb250aCwgeT1jb25kaXRpb25fc2NvcmUsIGdyb3VwID0gbW9udGgsIGZpbGwgPSBzaXRlKSkgKw0KICBnZW9tX2JveHBsb3QoKSsgDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC0zNSwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iTWVhbiBDb25kaXRpb24gU2NvcmUgLSAyMDI1IiwgeCA9Im1vbnRoIiwgeSA9ICJNZWFuIEJvZHkgQ29uZGl0aW9uIFNjb3JlIikrIHNjYWxlX3lfcmV2ZXJzZSgpK2ZhY2V0X3dyYXAofnNpdGUpDQoNCiNNZWFuIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAtIDIwMjYNCmRhdGFfMjAyNiA8LSBkYXRhX2FsbCU+JSAgZmlsdGVyKHllYXI9PSIyMDI2IikNCiAgDQpnZ3Bsb3QoZGF0YT1kYXRhXzIwMjYsIGFlcyh4PW1vbnRoLCB5PWNvbmRpdGlvbl9zY29yZSwgZ3JvdXAgPSBtb250aCwgZmlsbCA9IHNpdGUpKSArDQogIGdlb21fYm94cGxvdCgpKyANCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTM1LCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJNZWFuIENvbmRpdGlvbiBTY29yZSAtIDIwMjYiLCB4ID0ibW9udGgiLCB5ID0gIk1lYW4gQm9keSBDb25kaXRpb24gU2NvcmUiKSsgc2NhbGVfeV9yZXZlcnNlKCkrZmFjZXRfd3JhcCh+c2l0ZSkNCmBgYA0KI1Byb3BvcnRpb25zIGdyYXBoIEJvZHkgY29uZGl0aW9uIHNjb3Jlcw0KDQpgYGB7cn0NCiNQcm9wb3J0aW9ucyBncmFwaCBCb2R5IGNvbmRpdGlvbiBzY29yZXMgLSAyMDIzDQoNCmRmX0JDU19wcm9wb3J0aW9uczIwMjM8LSBkYXRhXzIwMjMgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KDQogIGdyb3VwX2J5KHNpdGUsIG1vbnRoLCB5ZWFyLCBjb25kaXRpb25fc2NvcmVfYmluKSAlPiUgZHBseXIgOjpzdW1tYXJpc2UoQ291bnQ9IG4oKSkgJT4lDQoNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoUHJvcG9ydGlvbiA9IENvdW50L3N1bShDb3VudCkpDQoNCmRmX0JDU19wcm9wb3J0aW9uczIwMjM8LSBuYS5vbWl0KGRmX0JDU19wcm9wb3J0aW9uczIwMjMpDQoNCkJDU19wcm9wb3J0aW9uX2FsbF8yMDIzPC0gZ2dwbG90KGRhdGE9ZGZfQkNTX3Byb3BvcnRpb25zMjAyMywgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3VyID0gImJsYWNrIikrICANCiAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHZqdXN0ID0gLjQsIGhqdXN0PS41KSkrDQogIGxhYnModGl0bGU9IlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzIC0gMjAyMyIsIHggPSJtb250aCIsIHkgPSAiUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgIikrIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID05MCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCkpKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIsIGRpcmVjdGlvbiA9IC0xKStzY2FsZV94X2NvbnRpbnVvdXMoIk1vbnRoIiwgYnJlYWtzID0gYygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMikpKyANCiAgZmFjZXRfd3JhcCh+IHNpdGUpDQoNCkJDU19wcm9wb3J0aW9uX2FsbF8yMDIzDQoNCg0KI3BkZihwYXN0ZTAocGF0aCA9ICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dCIgLCIvYWxsX0JDU19wcm9wb3J0aW9uXzIwMjMucGRmIiksIGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQojcHJpbnQoQkNTX3Byb3BvcnRpb25fYWxsXzIwMjMpDQojZGV2Lm9mZigpDQpgYGANCmBgYHtyfQ0KI1Byb3BvcnRpb25zIGdyYXBoIEJvZHkgY29uZGl0aW9uIHNjb3JlcyAtIDIwMjQNCmRmX0JDU19wcm9wb3J0aW9uczIwMjQ8LSBkYXRhXzIwMjQgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KDQogIGdyb3VwX2J5KHNpdGUsIG1vbnRoLCB5ZWFyLCBjb25kaXRpb25fc2NvcmVfYmluKSAlPiUgZHBseXIgOjpzdW1tYXJpc2UoQ291bnQ9IG4oKSkgJT4lDQoNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoUHJvcG9ydGlvbiA9IENvdW50L3N1bShDb3VudCkpDQoNCmRmX0JDU19wcm9wb3J0aW9uczIwMjQ8LSBuYS5vbWl0KGRmX0JDU19wcm9wb3J0aW9uczIwMjQpDQoNCkJDU19wcm9wb3J0aW9uX2FsbF8yMDI0PC0gZ2dwbG90KGRhdGE9ZGZfQkNTX3Byb3BvcnRpb25zMjAyNCwgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3VyID0gImJsYWNrIikrICANCiAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHZqdXN0ID0gLjQsIGhqdXN0PS41KSkrDQogIGxhYnModGl0bGU9IlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzIC0gMjAyNCIsIHggPSJtb250aCIsIHkgPSAiUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgIikrIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID05MCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCkpKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIsIGRpcmVjdGlvbiA9IC0xKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKCJNb250aCIsIGJyZWFrcyA9IGMoMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIpKSsgDQogIGZhY2V0X3dyYXAofiBzaXRlKQ0KDQpCQ1NfcHJvcG9ydGlvbl9hbGxfMjAyNA0KDQojcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiAsIi9hbGxfQkNTX3Byb3BvcnRpb25fMjAyNC5wZGYiKSwgaGVpZ2h0ID0gNywgd2lkdGggPSAxMykNCiNwcmludChCQ1NfcHJvcG9ydGlvbl9hbGxfMjAyNCkNCiNkZXYub2ZmKCkNCmBgYA0KYGBge3J9DQojUHJvcG9ydGlvbnMgZ3JhcGggQm9keSBjb25kaXRpb24gc2NvcmVzIC0gMjAyNQ0KZGZfQkNTX3Byb3BvcnRpb25zMjAyNTwtIGRhdGFfMjAyNSAlPiUNCiAgbXV0YXRlKGNvbmRpdGlvbl9zY29yZV9udW1lcmljID0gYXMubnVtZXJpYyhjb25kaXRpb25fc2NvcmUpLGNvbmRpdGlvbl9zY29yZV9iaW4gPSBjYXNlX3doZW4oY29uZGl0aW9uX3Njb3JlID09IDEgfiAiMSIsIGNvbmRpdGlvbl9zY29yZSA9PSAyIH4iMiIsY29uZGl0aW9uX3Njb3JlID09IDMgfiAiMyIsIGNvbmRpdGlvbl9zY29yZSA9PSA0IH4iNCIsY29uZGl0aW9uX3Njb3JlID09IDUgfiAiNSIsIGNvbmRpdGlvbl9zY29yZSA9PSA2IH4iNiIsY29uZGl0aW9uX3Njb3JlID09IDcgfiAiNyIsIGNvbmRpdGlvbl9zY29yZSA9PSA4IH4iOCIsIGNvbmRpdGlvbl9zY29yZSA9PTkgfiI5IiwgVFJVRSB+IGFzLmNoYXJhY3Rlcihjb25kaXRpb25fc2NvcmUpKSkgJT4lDQoNCiAgZ3JvdXBfYnkoc2l0ZSwgbW9udGgsIHllYXIsIGNvbmRpdGlvbl9zY29yZV9iaW4pICU+JSBkcGx5ciA6OnN1bW1hcmlzZShDb3VudD0gbigpKSAlPiUNCg0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShQcm9wb3J0aW9uID0gQ291bnQvc3VtKENvdW50KSkNCg0KZGZfQkNTX3Byb3BvcnRpb25zMjAyNTwtIG5hLm9taXQoZGZfQkNTX3Byb3BvcnRpb25zMjAyNSkNCg0KQkNTX3Byb3BvcnRpb25fYWxsXzIwMjU8LSBnZ3Bsb3QoZGF0YT1kZl9CQ1NfcHJvcG9ydGlvbnMyMDI1LCBhZXMoeD1tb250aCwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLCBjb2xvdXIgPSAiYmxhY2siKSsgIA0KICAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAuNCwgaGp1c3Q9LjUpKSsNCiAgbGFicyh0aXRsZT0iUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgLSAyMDI1IiwgeCA9Im1vbnRoIiwgeSA9ICJQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAiKSsgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPTkwKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSAwKSkrDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkJsdWVzIiwgZGlyZWN0aW9uID0gLTEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoIk1vbnRoIiwgYnJlYWtzID0gYygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMikpKyANCiAgZmFjZXRfd3JhcCh+IHNpdGUpIywgc2NhbGVzID0gImZyZWUiKQ0KDQpCQ1NfcHJvcG9ydGlvbl9hbGxfMjAyNQ0KDQojIHBkZihwYXN0ZTAocGF0aCA9ICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dCIgLCIvYWxsX0JDU19wcm9wb3J0aW9uXzIwMjUucGRmIiksIGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQojIHByaW50KEJDU19wcm9wb3J0aW9uX2FsbF8yMDI1KQ0KIyBkZXYub2ZmKCkNCmBgYA0KYGBge3J9DQojUHJvcG9ydGlvbnMgZ3JhcGggQm9keSBjb25kaXRpb24gc2NvcmVzIC0gMjAyNg0KZGZfQkNTX3Byb3BvcnRpb25zMjAyNjwtIGRhdGFfMjAyNiAlPiUNCiAgbXV0YXRlKGNvbmRpdGlvbl9zY29yZV9udW1lcmljID0gYXMubnVtZXJpYyhjb25kaXRpb25fc2NvcmUpLGNvbmRpdGlvbl9zY29yZV9iaW4gPSBjYXNlX3doZW4oY29uZGl0aW9uX3Njb3JlID09IDEgfiAiMSIsIGNvbmRpdGlvbl9zY29yZSA9PSAyIH4iMiIsY29uZGl0aW9uX3Njb3JlID09IDMgfiAiMyIsIGNvbmRpdGlvbl9zY29yZSA9PSA0IH4iNCIsY29uZGl0aW9uX3Njb3JlID09IDUgfiAiNSIsIGNvbmRpdGlvbl9zY29yZSA9PSA2IH4iNiIsY29uZGl0aW9uX3Njb3JlID09IDcgfiAiNyIsIGNvbmRpdGlvbl9zY29yZSA9PSA4IH4iOCIsIGNvbmRpdGlvbl9zY29yZSA9PTkgfiI5IiwgVFJVRSB+IGFzLmNoYXJhY3Rlcihjb25kaXRpb25fc2NvcmUpKSkgJT4lDQoNCiAgZ3JvdXBfYnkoc2l0ZSwgbW9udGgsIHllYXIsIGNvbmRpdGlvbl9zY29yZV9iaW4pICU+JSBkcGx5ciA6OnN1bW1hcmlzZShDb3VudD0gbigpKSAlPiUNCg0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShQcm9wb3J0aW9uID0gQ291bnQvc3VtKENvdW50KSkNCg0KZGZfQkNTX3Byb3BvcnRpb25zMjAyNjwtIG5hLm9taXQoZGZfQkNTX3Byb3BvcnRpb25zMjAyNikNCg0KQkNTX3Byb3BvcnRpb25fYWxsXzIwMjY8LSBnZ3Bsb3QoZGF0YT1kZl9CQ1NfcHJvcG9ydGlvbnMyMDI2LCBhZXMoeD1tb250aCwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLCBjb2xvdXIgPSAiYmxhY2siKSsgIA0KICAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAuNCwgaGp1c3Q9LjUpKSsNCiAgbGFicyh0aXRsZT0iUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgLSAyMDI2IiwgeCA9Ik1vbnRoIiwgeSA9ICJQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAiKSsgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPTkwKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSAwKSkrDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMikpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkJsdWVzIiwgZGlyZWN0aW9uID0gLTEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoIk1vbnRoIiwgYnJlYWtzID0gYygxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMikpKyANCiAgZmFjZXRfd3JhcCh+IHNpdGUpIywgc2NhbGVzID0gImZyZWUiKQ0KDQpCQ1NfcHJvcG9ydGlvbl9hbGxfMjAyNg0KDQpwZGYocGFzdGUwKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQiICwiL2FsbF9CQ1NfcHJvcG9ydGlvbl8yMDI2LnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoQkNTX3Byb3BvcnRpb25fYWxsXzIwMjYpDQpkZXYub2ZmKCkNCmBgYA0KDQpgYGB7cn0NCiNXaW50ZXIgc2FtcGxpbmcgDQojIHdpbnRlcl9iY3MgPC0gcmJpbmQoZGZfQkNTX3Byb3BvcnRpb25zMjAyNCwgZGZfQkNTX3Byb3BvcnRpb25zMjAyNSkNCiMgDQojIHdpbnRlcl9iY3MgPC0gd2ludGVyX2JjcyAlPiUgZmlsdGVyKG1vbnRoID09ICJEZWMifG1vbnRoID09ICJKYW4ifG1vbnRoID09ICJGZWIiKQ0KIyANCiMgQkNTX3Byb3BvcnRpb25fd2ludGVyPC0gZ2dwbG90KGRhdGE9d2ludGVyX2JjcywgYWVzKHg9ZmFjdG9yIChtb250aCwgbGV2ZWw9YygnRGVjJywgJ0phbicsICdGZWInKSksIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiMgICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLCBjb2xvdXIgPSAiYmxhY2siKSsgIA0KIyAgICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpKSsNCiMgICBsYWJzKHRpdGxlPSJQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAtIFdpbnRlciBTYW1wbGluZyAyMDI0LTIwMjUiLCB4ID0iTW9udGgiLCB5ID0gIlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzICIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9IDApKSsNCiMgICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSsNCiMgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkJsdWVzIiwgZGlyZWN0aW9uID0gLTEpKw0KIyAgIGZhY2V0X3dyYXAofiBzaXRlKQ0KIyANCiMgQkNTX3Byb3BvcnRpb25fd2ludGVyDQpgYGANCg0KYGBge3J9DQojIFByb3BvcnRpb24gcGVyIG1vbnRoIG9mIGludGVuc2l0eSBzY29yZXMgYXQgdGhyZWUgc2l0ZXMgZHVyaW5nIDIwMjMgJiAyMDI0ICYgMjAyNSAmIDIwMjYNCmRmX2Jjc19wcm9wb3J0aW9uc19uZXcgPC0gcmJpbmQoZGZfQkNTX3Byb3BvcnRpb25zMjAyMywgZGZfQkNTX3Byb3BvcnRpb25zMjAyNCwgZGZfQkNTX3Byb3BvcnRpb25zMjAyNSwgZGZfQkNTX3Byb3BvcnRpb25zMjAyNikNCg0KZGZfYmNzX3Byb3BvcnRpb25zX25ldzwtIGRmX2Jjc19wcm9wb3J0aW9uc19uZXcgJT4lIGZpbHRlcighc2l0ZT09IkxBVVIiKQ0KDQpQcm9wb3J0aW9uX29mX0JvZHlfQ29uZGl0aW9uX1Njb3JlcyA8LSBnZ3Bsb3QoZGF0YT1kZl9iY3NfcHJvcG9ydGlvbnNfbmV3LCBhZXMoeD1tb250aCwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLGNvbG91ciA9ICJibGFjayIpKyAgDQogICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHZqdXN0ID0gMSwgaGp1c3Q9LjUpKSsNCiAgbGFicyhmaWxsID0iQm9keSBDb25kaXRpb24gU2NvcmVzIiwgZWxlbWVudF90ZXh0KHNpemUgPSAxLjUpKSsNCiAgbGFicyh0aXRsZT0iUHJvcG9ydGlvbiBvZiBCb2R5IENvbmRpdGlvbiBTY29yZXMiLCB4ID0ibW9udGgiLCB5ID0gIlByb3BvcnRpb24iKSsgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4wKSwgYW5nbGUgPTkwKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4wKSwgYW5nbGUgPSAwKSkrIA0KICB0aGVtZSh0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKSsNCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkrDQpzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkJsdWVzIiwgZGlyZWN0aW9uID0gLTEpKyAjY2FuIHVzZSBwYWxldHRlICJTcGVjdHJhbCINCiAgc2NhbGVfeF9jb250aW51b3VzKCJNb250aCIsIGJyZWFrcyA9IGMoMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIpKSsgc2NhbGVfc2l6ZShlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjApKSkrDQogIGZhY2V0X2dyaWQoeWVhciB+c2l0ZSkrDQogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikNCg0KICBwcmludChQcm9wb3J0aW9uX29mX0JvZHlfQ29uZGl0aW9uX1Njb3JlcykNCmBgYA0KDQoNCg0KDQojU2hlbGwgUGF0aG9sb2d5IC0gYWxsIGRhdGENCiNJbmNsdWRlcyAyMDIzIGRhdGEgYW5kIGFsbCBkYXRhIHRoYXQgaXMgaW4gdGhlIDIwMjQgZm9ybWF0DQpgYGB7cn0NCnNoZWxsX3BhdGggPC0gbGlzdC5maWxlcyhwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3NpbmcvcmF3X2RhdGEvc2hlbGxfcGF0aG9sb2d5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElkZW50aWZ5IGFsbCBDU1YgZmlsZXMNCiBwYXR0ZXJuID0gIiouY3N2IiwgZnVsbC5uYW1lcyA9IFRSVUUpICU+JSANCmxhcHBseShyZWFkX2NzdikgJT4lICAgIyBTdG9yZSBhbGwgZmlsZXMgaW4gbGlzdA0KICBiaW5kX3Jvd3MgICAgICAgICAgIyBDb21iaW5lIGRhdGEgc2V0cyBpbnRvIG9uZSBkYXRhIHNldCANCg0Kc2hlbGxfcGF0aCA8LSBzaGVsbF9wYXRoICU+JSBmaWx0ZXIoIWlzLm5hKGxhYl9pZCkpDQoNCnNoZWxsX3BhdGggPC0gc2hlbGxfcGF0aCAlPiUgc2VsZWN0KC1jKCIuLi4xNCI6Ii4uLjI2IikpDQoNCndyaXRlLmNzdihzaGVsbF9wYXRoLCAiTWFzdGVyX2ZpbGVzL3NoZWxsX3BhdGhvbG9neV9hbGxfZGF0YS5jc3YiLCByb3cubmFtZXM9RkFMU0UpDQoNCg0KI1dyaXRpbmcgc3VtbWFyeSBmb3Igc2hlbGwgcGF0aG9sb2d5DQoNCiMgQ2xlYW4gdXAsIGNvbnZlcnQgdG8gaW50ZWdlciwgZHJvcCBJRCwgZXRjLg0Kc2hlbGxfcGF0aF9zdW1tYXJ5IDwtIHNoZWxsX3BhdGggJT4lDQogICMgc3BsaXQgYGxhYl9pZGAgaW50byB0d28gcGFydHMNCiAgc2VwYXJhdGUobGFiX2lkLCBpbnRvID0gYygiRGF0ZV9TaXRlIiwgIklEIikpICU+JQ0KICAjIGRyb3AgdW53YW50ZWQgY29sdW1ucw0KICBzZWxlY3QoLXBhdGhvbG9neV9ub3RlcywgLUlEKSAlPiUNCiAgIyBjb252ZXJ0IGEgc2V0IG9mIGxvZ2ljYWwgKG9yIHdoYXRldmVyKSBjb2x1bW5zIHRvIDAvMQ0KICBtdXRhdGUoYWNyb3NzKA0KICAgIGMoYm9yaW5nX3Nwb25nZSwgcG9seWRvcmEsIGNvbmNoaW9saW5fbW9kX3NldmVyZSwgbXVkX2JsaXN0ZXIsDQogICAgICBwZWFfY3JhYiwgZ2lsbF9lcm9zaW9uLCBwYWxlX2RpZ2VzdGl2ZSwgZGlzY29sb3JhdGlvbiwNCiAgICAgIGhvcm5fYWRkLCBjeXN0X2Fic2Nlc3MsIHR1bW9yLCBveXN0ZXJfZHJpbGwsDQogICAgICBib3Jpbmdfc25haWwsIHNoZWxsX3NjYXJyaW5nKSwNCiAgICB+IGFzLmludGVnZXIoYXMubG9naWNhbCguKSkNCiAgKSkNCg0KDQojIENvbXB1dGUgYSBwYXRob2dlbuKAkGluZGljYXRvciBzdW0gKnBlciBzYW1wbGUqIChyb3cpLg0Kc2hlbGxfcGF0aF9zdW1tYXJ5IDwtIHNoZWxsX3BhdGhfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKA0KICAgIFBhdGhvZ2VuX2NvdW50ID0gcm93U3VtcygNCiAgICAgIHNlbGVjdCguLCBib3Jpbmdfc3BvbmdlLCBwb2x5ZG9yYSwgY29uY2hpb2xpbl9tb2Rfc2V2ZXJlLCBtdWRfYmxpc3RlciwNCiAgICAgICAgICAgICBwZWFfY3JhYiwgZ2lsbF9lcm9zaW9uLCBwYWxlX2RpZ2VzdGl2ZSwgZGlzY29sb3JhdGlvbiwNCiAgICAgICAgICAgICBob3JuX2FkZCwgY3lzdF9hYnNjZXNzLCB0dW1vciwgb3lzdGVyX2RyaWxsLA0KICAgICAgICAgICAgIGJvcmluZ19zbmFpbCwgc2hlbGxfc2NhcnJpbmcpLA0KICAgICAgbmEucm0gPSBUUlVFDQogICAgKQ0KICApDQoNCiMgTm93IGdyb3VwICsgc3VtbWFyaXNlDQpzaGVsbF9wYXRoX2NvdW50IDwtIHNoZWxsX3BhdGhfc3VtbWFyeSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZV9TaXRlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIFNhbXBsZV9jb3VudCA9IG4oKSwNCiAgICBhY3Jvc3MoDQogICAgICBjKGJvcmluZ19zcG9uZ2UsIHBvbHlkb3JhLCBjb25jaGlvbGluX21vZF9zZXZlcmUsIG11ZF9ibGlzdGVyLA0KICAgICAgICBwZWFfY3JhYiwgZ2lsbF9lcm9zaW9uLCBwYWxlX2RpZ2VzdGl2ZSwgZGlzY29sb3JhdGlvbiwNCiAgICAgICAgaG9ybl9hZGQsIGN5c3RfYWJzY2VzcywgdHVtb3IsIG95c3Rlcl9kcmlsbCwNCiAgICAgICAgYm9yaW5nX3NuYWlsLCBzaGVsbF9zY2FycmluZywgUGF0aG9nZW5fY291bnQpLA0KICAgICAgc3VtLA0KICAgICAgbmEucm0gPSBUUlVFDQogICAgKQ0KICApICU+JQ0KICB1bmdyb3VwKCkNCg0Kc2hlbGxfcGF0aF9jb3VudA0Kc2hlbGxfcGF0aF9zdW1tYXJ5DQoNCndyaXRlLmNzdihzaGVsbF9wYXRoX2NvdW50LCAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQvc2hlbGxfcGF0aG9sb2d5X2NvdW50cy5jc3YiLCByb3cubmFtZXM9RkFMU0UpDQoNCg0KYGBgDQoNCg0KIyMjIyMjIFByZWxpbWluYXJ5IFN0YXRpc3RpY3Mgb24gQUxMIGJvZHkgY29uZGl0aW9uIGRhdGEgIyMjIyMjDQpgYGB7cn0NCg0KDQpgYGANCg0KDQojIyMjIyMjIyMjIyBJbmRpdmlkdWFsIHNpdGUgc3VtbWFyaWVzIGFuZCBRQVFDICMjIyMjIyMjIyMjDQoNCg0KIyBBc2ggQ3JlZWsgU3VtbWFyeQ0KYGBge3J9DQoNCmRmX0FTSEM8LSBkYXRhX2FsbCU+JQ0KICBmaWx0ZXIoc2l0ZT09IkFTSEMiKQ0KZGZfQVNIQw0KDQojIyBTaGVsbCBIZWlnaHQgIyMNCnN0X2hlaWdodF9BU0hDIDwtIHN1bW1hcnlTRShkZl9BU0hDLCBtZWFzdXJldmFyPSJoZWlnaHRfbW0iLCBncm91cHZhcnM9YygiZGF0ZV9jb2xsZWN0ZWQiKSkNCnN0X2hlaWdodF9BU0hDDQoNCiMjIEJvZHkgQ29uZGl0aW9uICMjDQojRXhjbHVkZXMgQXByaWwgYW5kIE1heSBkdWUgdG8gc2NvcmluZyBjaGFuZ2UuIFRoZXNlIG1vbnRocyBhcmUgc2NvcmVkIGNhdGVnb3JpY2FsbHkgJ2ZhdCwgbWVkaXVtLCB3YXRlcnknLiANCg0Kc3RfY29uZGl0aW9uX0FTSEM8LSBzdW1tYXJ5U0UoZGZfQVNIQywgbWVhc3VyZXZhciA9ICJjb25kaXRpb25fc2NvcmUiLCBncm91cHZhcnMgPSBjKCJkYXRlX2NvbGxlY3RlZCIpKQ0Kc3RfY29uZGl0aW9uX0FTSEMNCg0KbWVhbl9jb25kaXRpb25fQVNIQyA8LSBzdF9jb25kaXRpb25fQVNIQyAlPiUNCiAgZmlsdGVyKCFpcy5uYShjb25kaXRpb25fc2NvcmUpKSAlPiUgIyBGaWx0ZXIgb3V0IHJvd3Mgd2hlcmUgY29uZGl0aW9uX3Njb3JlIGlzIE5BDQogIGdyb3VwX2J5KGRhdGVfY29sbGVjdGVkKSU+JQ0KICBzdW1tYXJpemUobWVhbl9iY3MgPSBtZWFuKGNvbmRpdGlvbl9zY29yZSwgbmEucm0gPSBUUlVFKSkNCm1lYW5fY29uZGl0aW9uX0FTSEMNCg0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1kZl9BU0hDLCBhZXMoeD1tb250aCwgeT1oZWlnaHRfbW0sIGdyb3VwPSBtb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSIgQXNoIENyZWVrIE1lYW4gU2hlbGwgSGVpZ2h0ICIsIHggPSJtb250aCIsIHkgPSAiTWVhbiBTaGVsbCBIZWlnaHQgKG1tKSIpK2ZhY2V0X3dyYXAoLn55ZWFyKQ0KYGBgDQoNCmBgYHtyfQ0KI0NvbmRpdGlvbiBkaXN0cmlidXRpb24gYWNyb3NzIGFsbCBzYW1wbGUgbW9udGhzIC0gMjAyMw0KZGZfQVNIQ18yMDIzIDwtIGRmX0FTSEMlPiUgIGZpbHRlcigheWVhcj09IjIwMjQiKQ0KDQpBU0hDX0JDU19kaXN0MjAyMyA8LWdncGxvdChkYXRhPWRmX0FTSENfMjAyMywgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkFzaCBDcmVlayBCb2R5IENvbmRpdGlvbiBTY29yZSAtIDIwMjMiLCB4ID0iQ29uZGl0aW9uIGNhdGVnb3JpemF0aW9uIikrDQogIGZhY2V0X3dyYXAofiBtb250aCwgc2NhbGVzID0gImZyZWUiKQ0KQVNIQ19CQ1NfZGlzdDIwMjMNCg0KI3BkZihwYXN0ZTAocGF0aCA9ICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dCIgLCIvQVNIQ19CQ1NfZGlzdF8yMDIzLnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KI3ByaW50KEFTSENfQkNTX2Rpc3QyMDIzKQ0KI2Rldi5vZmYoKQ0KDQojQ29uZGl0aW9uIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgYWxsIHNhbXBsZSBtb250aHMgLSAyMDI0DQpkZl9BU0hDXzIwMjQgPC0gZGZfQVNIQyU+JSAgZmlsdGVyKCF5ZWFyPT0iMjAyMyIpDQoNCkFTSENfQkNTX2Rpc3QyMDI0IDwtZ2dwbG90KGRhdGE9ZGZfQVNIQ18yMDI0LCBhZXMoeD0gY29uZGl0aW9uKSkgKw0KICBnZW9tX2JhcigpKyAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJmb3Jlc3RncmVlbiIsIm9yYW5nZSIsICJwdXJwbGUiKSkrDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iQXNoIENyZWVrIEJvZHkgQ29uZGl0aW9uIFNjb3JlIC0gMjAyNCIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgZmFjZXRfd3JhcCh+IG1vbnRoLCBzY2FsZXMgPSAiZnJlZSIpDQpBU0hDX0JDU19kaXN0MjAyNA0KDQojcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiAsIi9BU0hDX0JDU19kaXN0XzIwMjQucGRmIiksIGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQojcHJpbnQoQVNIQ19CQ1NfZGlzdDIwMjQpDQojZGV2Lm9mZigpDQoNCiNDb25kaXRpb24gZGlzdHJpYnV0aW9uIGFjcm9zcyBhbGwgc2FtcGxlIG1vbnRocyAtIDIwMjUNCmRmX0FTSENfMjAyNSA8LSBkZl9BU0hDJT4lICBmaWx0ZXIoeWVhcj09IjIwMjUiKQ0KDQpBU0hDX0JDU19kaXN0MjAyNSA8LWdncGxvdChkYXRhPWRmX0FTSENfMjAyNSwgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkFzaCBDcmVlayBCb2R5IENvbmRpdGlvbiBTY29yZSAtIDIwMjUiLCB4ID0iQ29uZGl0aW9uIGNhdGVnb3JpemF0aW9uIikrDQogIGZhY2V0X3dyYXAofiBtb250aCwgc2NhbGVzID0gImZyZWUiKQ0KQVNIQ19CQ1NfZGlzdDIwMjUNCg0KIyBwZGYocGFzdGUwKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQiICwiL0FTSENfQkNTX2Rpc3RfMjAyNS5wZGYiKSwgaGVpZ2h0ID0gNywgd2lkdGggPSAxMykNCiMgcHJpbnQoQVNIQ19CQ1NfZGlzdDIwMjUpDQojIGRldi5vZmYoKQ0KDQojQ29uZGl0aW9uIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgYWxsIHNhbXBsZSBtb250aHMgLSAyMDI2DQpkZl9BU0hDXzIwMjYgPC0gZGZfQVNIQyU+JSAgZmlsdGVyKHllYXI9PSIyMDI2IikNCg0KQVNIQ19CQ1NfZGlzdDIwMjYgPC1nZ3Bsb3QoZGF0YT1kZl9BU0hDXzIwMjYsIGFlcyh4PSBjb25kaXRpb24pKSArDQogIGdlb21fYmFyKCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJBc2ggQ3JlZWsgQm9keSBDb25kaXRpb24gU2NvcmUgLSAyMDI2IiwgeCA9IkNvbmRpdGlvbiBjYXRlZ29yaXphdGlvbiIpKw0KICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCkFTSENfQkNTX2Rpc3QyMDI2DQoNCnBkZihwYXN0ZTAocGF0aCA9ICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dCIgLCIvQVNIQ19CQ1NfZGlzdF8yMDI2LnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoQVNIQ19CQ1NfZGlzdDIwMjYpDQpkZXYub2ZmKCkNCmBgYA0KDQoNCmBgYHtyfQ0KI01lYW4gQm9keSBjb25kaXRpb24gcGVyIG1vbnRoDQpnZ3Bsb3QoZGF0YT1kZl9BU0hDLCBhZXMoeD0gbW9udGgsIHk9IGNvbmRpdGlvbl9zY29yZSwgZ3JvdXAgPSBtb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJBc2ggQ3JlZWsgTWVhbiBCb2R5IENvbmRpdGlvbiBTY29yZSAiLCB4ID0ibW9udGgiLCB5PSAiIGNvbmRpdGlvbiBzY29yZSAoMS05KSIpICsgc2NhbGVfeV9yZXZlcnNlKCkrZmFjZXRfd3JhcCgufnllYXIpDQoNCmBgYA0KDQojQVNIQyBQcm9wb3J0aW9ucyBncmFwaCBCb2R5IGNvbmRpdGlvbiBzY29yZXMgLSBhbGwgeWVhcnMNCg0KYGBge3J9DQoNCkFTSENfQkNTX3Byb3BvcnRpb25zPC0gZGZfQVNIQyAlPiUNCiAgbXV0YXRlKGNvbmRpdGlvbl9zY29yZV9udW1lcmljID0gYXMubnVtZXJpYyhjb25kaXRpb25fc2NvcmUpLGNvbmRpdGlvbl9zY29yZV9iaW4gPSBjYXNlX3doZW4oY29uZGl0aW9uX3Njb3JlID09IDEgfiAiMSIsIGNvbmRpdGlvbl9zY29yZSA9PSAyIH4iMiIsY29uZGl0aW9uX3Njb3JlID09IDMgfiAiMyIsIGNvbmRpdGlvbl9zY29yZSA9PSA0IH4iNCIsY29uZGl0aW9uX3Njb3JlID09IDUgfiAiNSIsIGNvbmRpdGlvbl9zY29yZSA9PSA2IH4iNiIsY29uZGl0aW9uX3Njb3JlID09IDcgfiAiNyIsIGNvbmRpdGlvbl9zY29yZSA9PSA4IH4iOCIsIGNvbmRpdGlvbl9zY29yZSA9PTkgfiI5IiwgVFJVRSB+IGFzLmNoYXJhY3Rlcihjb25kaXRpb25fc2NvcmUpKSkgJT4lDQogIGdyb3VwX2J5KHNpdGUsIG1vbnRoLCBjb25kaXRpb25fc2NvcmVfYmluLCB5ZWFyKSAlPiUgZHBseXI6OnN1bW1hcmlzZShDb3VudD0gbigpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoUHJvcG9ydGlvbiA9IENvdW50L3N1bShDb3VudCkpDQoNCkFTSENfQkNTX3Byb3BvcnRpb25zPC0gbmEub21pdChBU0hDX0JDU19wcm9wb3J0aW9ucykNCg0KQVNIQ19CQ1NfcHJvcG9ydGlvbnMNCg0KQkNTX3Byb3BvcnRpb25fQVNIQzwtIGdncGxvdChkYXRhPUFTSENfQkNTX3Byb3BvcnRpb25zLCBhZXMoeD1tb250aCwgeT0gUHJvcG9ydGlvbiwgZmlsbD1jb25kaXRpb25fc2NvcmVfYmluKSkgKw0KICBnZW9tX2Jhcih3aWR0aCA9IC41LCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSsgIA0KICAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJBc2ggQ3JlZWsgUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgSnVuZS0gTm92ZW1iZXIiLCB4ID0ibW9udGgiLCB5ID0gIlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzICIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9IDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkrDQogIGZhY2V0X3dyYXAofiB5ZWFyKQ0KICNzY2FsZV9maWxsX2JyZXdlcigpICsNCiAgI2ZhY2V0X3dyYXAofiBzaXRlKQ0KDQpCQ1NfcHJvcG9ydGlvbl9BU0hDDQogIA0KcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiAsIi9BU0hDX0JDU19wcm9wb3J0aW9uLnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoQkNTX3Byb3BvcnRpb25fQVNIQykNCmRldi5vZmYoKQ0KYGBgDQoNCiMgJSBvZiBzY29yZXMgPjMgYXQgYXNoIGNyZWVrIC0gYWxsIHllYXJzDQpgYGB7cn0NCmRmX0FTSEMNCg0KQVNIQ19wZXJjZW50X2dyZWF0ZXJfMyA8LSBkZl9BU0hDICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkobW9udGgsIHNpdGUsIHllYXIpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKFBlcmNlbnRhZ2UgPSBtZWFuKGNvbmRpdGlvbl9zY29yZSA8PSAzKSoxMDApDQpBU0hDX3BlcmNlbnRfZ3JlYXRlcl8zDQoNCkFTSENfQkNTX3BlcmNlbnRhZ2UgPC0gQVNIQ19wZXJjZW50X2dyZWF0ZXJfMyU+JSANCiAgI2ZpbHRlcih5ZWFyID09IjIwMjQiKSU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IFBlcmNlbnRhZ2UpKSArDQogICNnZW9tX2Jhcih3aWR0aCA9IDAuNSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArDQogICAgZ2VvbV9jb2woKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0ID0gMSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSA5MCksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBc2ggQ3JlZWsgJSBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgPj0gMyIsDQogICAgeCA9ICJtb250aCIsDQogICAgeSA9ICJQZXJjZW50YWdlIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyA+PSAzIg0KICApICsNCiAgICBmYWNldF93cmFwKH55ZWFyKQ0KICAjc2NhbGVfeF9jb250aW51b3VzKCBicmVha3MgPSBzZXEoNSwxMiwgYnkgPTEpICkrDQogICN5bGltKDAsNjApKyANCiAgI3NjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTAwKSwgYnJlYWtzID0gc2VxKDAsMTAwLCBieSA9IDEwKSkNCkFTSENfQkNTX3BlcmNlbnRhZ2UNCg0KcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiwgIi9BU0hDX0JDU19wZXJjZW50YWdlLnBkZiIpLGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQpwcmludChBU0hDX0JDU19wZXJjZW50YWdlKQ0KZGV2Lm9mZigpIA0KDQoNCg0KYGBgDQoNCg0KDQoNCiMgRmVuY2UgQ3JlZWsgU3VtbWFyeQ0KYGBge3J9DQpkZl9GRU5DPC0gZGF0YV9hbGwlPiUNCiAgZmlsdGVyKHNpdGU9PSJGRU5DIikNCmRmX0ZFTkMNCg0KIyMgU2hlbGwgSGVpZ2h0ICMjDQpzdF9oZWlnaHRfRkVOQyA8LSBzdW1tYXJ5U0UoZGZfRkVOQywgbWVhc3VyZXZhcj0iaGVpZ2h0X21tIiwgZ3JvdXB2YXJzPWMoImRhdGVfY29sbGVjdGVkIikpDQpzdF9oZWlnaHRfRkVOQyANCg0KIyMgQm9keSBDb25kaXRpb24gIyMNCiNFeGNsdWRlcyBBcHJpbCBhbmQgTWF5IGR1ZSB0byBzY29yaW5nIGNoYW5nZS4gVGhlc2UgbW9udGhzIGFyZSBzY29yZWQgY2F0ZWdvcmljYWxseSAnZmF0LCBtZWRpdW0sIHdhdGVyeScuIA0KDQpzdF9jb25kaXRpb25fRkVOQzwtIHN1bW1hcnlTRShkZl9GRU5DJT4lIGZpbHRlcighaXMubmEoY29uZGl0aW9uX3Njb3JlKSksIG1lYXN1cmV2YXIgPSAiY29uZGl0aW9uX3Njb3JlIiwgZ3JvdXB2YXJzID0gYygiZGF0ZV9jb2xsZWN0ZWQiKSkNCnN0X2NvbmRpdGlvbl9GRU5DDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZGZfRkVOQywgYWVzKHg9bW9udGgsIHk9aGVpZ2h0X21tLCBncm91cD1tb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSIgRmVuY2UgQ3JlZWsgTWVhbiBTaGVsbCBIZWlnaHQgIiwgeCA9Im1vbnRoIiwgeSA9ICJNZWFuIFNoZWxsIEhlaWdodCAobW0pIikrIGZhY2V0X3dyYXAoLn55ZWFyKQ0KDQpgYGANCg0KYGBge3J9DQojQ29uZGl0aW9uIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgYWxsIHNhbXBsZSBtb250aHMgLSAyMDIzDQpkZl9GRU5DLjIwMjMgPC0gZGZfRkVOQyU+JSAgZmlsdGVyKCF5ZWFyPT0iMjAyNCIpDQoNCmdncGxvdChkYXRhPWRmX0ZFTkMuMjAyMywgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkZlbmNlIENyZWVrIEJvZHkgQ29uZGl0aW9uIGluZGV4IC0gMjAyMyIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KI0NvbmRpdGlvbiBkaXN0cmlidXRpb24gYWNyb3NzIGFsbCBzYW1wbGUgbW9udGhzIC0gMjAyNA0KZGZfRkVOQy4yMDI0IDwtIGRmX0ZFTkMlPiUgIGZpbHRlcih5ZWFyPT0iMjAyNCIpDQoNCmdncGxvdChkYXRhPWRmX0ZFTkMuMjAyNCwgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkZlbmNlIENyZWVrIEJvZHkgQ29uZGl0aW9uIGluZGV4IC0gMjAyNCIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KI0NvbmRpdGlvbiBkaXN0cmlidXRpb24gYWNyb3NzIGFsbCBzYW1wbGUgbW9udGhzIC0gMjAyNQ0KZGZfRkVOQy4yMDI1IDwtIGRmX0ZFTkMlPiUgIGZpbHRlcih5ZWFyPT0iMjAyNSIpDQoNCmdncGxvdChkYXRhPWRmX0ZFTkMuMjAyNSwgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkZlbmNlIENyZWVrIEJvZHkgQ29uZGl0aW9uIGluZGV4IC0gMjAyNSIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KI0NvbmRpdGlvbiBkaXN0cmlidXRpb24gYWNyb3NzIGFsbCBzYW1wbGUgbW9udGhzIC0gMjAyNg0KZGZfRkVOQy4yMDI2IDwtIGRmX0ZFTkMlPiUgIGZpbHRlcih5ZWFyPT0iMjAyNiIpDQoNCmdncGxvdChkYXRhPWRmX0ZFTkMuMjAyNiwgYWVzKHg9IGNvbmRpdGlvbikpICsNCiAgZ2VvbV9iYXIoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkZlbmNlIENyZWVrIEJvZHkgQ29uZGl0aW9uIGluZGV4IC0gMjAyNiIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KDQojTWVhbiBCb2R5IGNvbmRpdGlvbiBwZXIgbW9udGgNCmdncGxvdChkYXRhPWRmX0ZFTkMsIGFlcyh4PSBtb250aCwgeT0gY29uZGl0aW9uX3Njb3JlLCBncm91cCA9IG1vbnRoKSkgKw0KICBnZW9tX2JveHBsb3QoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkZlbmNlIENyZWVrIE1lYW4gQm9keSBDb25kaXRpb24gU2NvcmUiLCB4ID0ibW9udGgiLCB5PSAiIGNvbmRpdGlvbiBzY29yZSAoMS05KSIpKyBzY2FsZV95X3JldmVyc2UoKSArIGZhY2V0X3dyYXAofiB5ZWFyLCBzY2FsZXMgPSAiZnJlZSIpDQoNCmBgYA0KI0ZFTkMgUHJvcG9ydGlvbnMgZ3JhcGggQm9keSBjb25kaXRpb24gc2NvcmVzIC0gYWxsIHllYXJzDQoNCmBgYHtyfQ0KDQpGRU5DX0JDU19wcm9wb3J0aW9uczwtIGRmX0ZFTkMgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KICBncm91cF9ieShzaXRlLCBtb250aCwgY29uZGl0aW9uX3Njb3JlX2JpbiwgeWVhcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoQ291bnQ9IG4oKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKFByb3BvcnRpb24gPSBDb3VudC9zdW0oQ291bnQpKQ0KDQpGRU5DX0JDU19wcm9wb3J0aW9uczwtIG5hLm9taXQoRkVOQ19CQ1NfcHJvcG9ydGlvbnMpDQoNCkZFTkNfQkNTX3Byb3BvcnRpb25zDQoNCkJDU19wcm9wb3J0aW9uX0ZFTkM8LSBnZ3Bsb3QoZGF0YT1GRU5DX0JDU19wcm9wb3J0aW9ucywgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikrICANCiAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iRmVuY2UgQ3JlZWsgUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMiLCB4ID0ibW9udGgiLCB5ID0gIlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzICIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9IDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkrDQogIGZhY2V0X3dyYXAofiB5ZWFyKQ0KICNzY2FsZV9maWxsX2JyZXdlcigpICsNCiAgI2ZhY2V0X3dyYXAofiBzaXRlKQ0KDQpCQ1NfcHJvcG9ydGlvbl9GRU5DDQogIA0KcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiAsIi9GRU5DX0JDU19wcm9wb3J0aW9uLnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoQkNTX3Byb3BvcnRpb25fRkVOQykNCmRldi5vZmYoKQ0KYGBgDQojICUgb2Ygc2NvcmVzID4zIGF0IEZlbmNlIENyZWVrIC0gYWxsIHllYXJzDQpgYGB7cn0NCiNyZW1vdmluZyAwODIzRkVOQ18yOCBiY3Mgd2FzIE5BDQpkZl9GRU5DIDwtIGRmX0ZFTkMgJT4lIGRyb3BfbmEoY29uZGl0aW9uKQ0KDQpGRU5DX3BlcmNlbnRfZ3JlYXRlcl8zIDwtIGRmX0ZFTkMgJT4lDQogIGRwbHlyOjpncm91cF9ieShtb250aCwgeWVhcikgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UoUGVyY2VudGFnZSA9IG1lYW4oY29uZGl0aW9uX3Njb3JlIDw9IDMpKjEwMCkNCkZFTkNfcGVyY2VudF9ncmVhdGVyXzMNCg0KRkVOQ19CQ1NfcGVyY2VudGFnZSA8LSBGRU5DX3BlcmNlbnRfZ3JlYXRlcl8zICU+JQ0KICBmaWx0ZXIoeWVhciA9PSIyMDI1IiklPiUNCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBQZXJjZW50YWdlKSkgKw0KICAjZ2VvbV9iYXIod2lkdGggPSAwLjUsIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICAgIGdlb21fY29sKCkrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gOTApLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRmVuY2UgQ3JlZWsgJSBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgPj0gMyIsDQogICAgeCA9ICJtb250aCIsDQogICAgeSA9ICJQZXJjZW50YWdlIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyA+PSAzIg0KICApICsNCiAgICBmYWNldF93cmFwKH55ZWFyKQ0KICAjc2NhbGVfeF9jb250aW51b3VzKCBicmVha3MgPSBzZXEoNSwxMiwgYnkgPTEpICkrDQogICN5bGltKDAsNjApKyANCiAgI3NjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTAwKSwgYnJlYWtzID0gc2VxKDAsMTAwLCBieSA9IDEwKSkNCkZFTkNfQkNTX3BlcmNlbnRhZ2UNCg0KcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiwgIi9GRU5DX0JDU19wZXJjZW50YWdlLnBkZiIpLGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQpwcmludChGRU5DX0JDU19wZXJjZW50YWdlKQ0KZGV2Lm9mZigpIA0KDQoNCg0KYGBgDQoNCg0KIyBHb2xkIFN0YXIgQmVhY2ggU3VtbWFyeQ0KIyAwNTI0R09MRCBoYXMgNDYgc2FtcGxlcyAtIHdlIGF0dGVtcHRlZCB0byBzYW1wbGUgZnJvbSAyMDIyIGFuZCAyMDIzIHBsYW50aW5nIGFuZCBjb25zaWRlciB0aGVtIHNlcGVyYXRlIGJ1dCBpdCBhcHBlYXJlZCB0aGF0IGR1ZSB0byBhIHN0b3JtIHRoZSBwbGFudGluZ3MgbWl4ZWQgdG9nZXRoZXIuIA0KIyBObyBzYW1wbGVzIGNvbGxlY3RlZCBmb3IgT2N0b2JlciAmIE5vdmVtYmVyIGF0IEdvbGQgU3RhciBpbiAyMDI1IGR1ZSB0byBmZWRlcmFsIGdvdmVybm1lbnQgbGFwc2UgaW4gYXBwcm9wcmlhdGlvbi4NCiMgMTIyNUdPTEQgaGFzIDkgc2FtcGxlcyAtIGR1ZSB0byBpbmFibGlsaXR5IHRvIGNvbGxlY3QgZW5vdWdoIHNhbXBsZXMgaW4gdW5mYXZvcmFibGUgY29uZGl0aW9ucy4NCg0KYGBge3J9DQpkZl9HT0xEPC0gZGF0YV9hbGwlPiUNCiAgZmlsdGVyKHNpdGU9PSJHT0xEIikNCmRmX0dPTEQgPC0gZGZfR09MRCAlPiUgZmlsdGVyKCFpcy5uYShoZWlnaHRfbW0pKQ0KDQojMjAyMyBkYXRhDQpkZl9HT0xEMjAyMyA8LSBkZl9HT0xEJT4lICBmaWx0ZXIoIXllYXI9PSIyMDI0IikNCg0KIzIwMjQgZGF0YQ0KZGZfR09MRDIwMjQgPC0gZGZfR09MRCU+JSAgZmlsdGVyKCF5ZWFyPT0iMjAyMyIpDQoNCmRmX0dPTEQkaGVpZ2h0X21tPC1hcy5udW1lcmljKGRmX0dPTEQkaGVpZ2h0X21tKQ0KDQptZWFuX3NoZWxsX2hlaWdodCA8LSBkZl9HT0xEICU+JSBtdXRhdGUoeWVhciA9IHllYXIoZGF0ZV9jb2xsZWN0ZWQpKSAlPiUgZ3JvdXBfYnkoeWVhciklPiUgZHBseXI6OnN1bW1hcmlzZShtZWFuX2hlaWdodCA9IG1lYW4oaGVpZ2h0X21tKSkgI3N1bW1hcnlTRShtZWFzdXJldmFyPSJoZWlnaHRfbW0iLCBncm91cHZhcnM9YygieWVhciIpKQ0KbWVhbl9zaGVsbF9oZWlnaHQNCg0KIyMgU2hlbGwgSGVpZ2h0ICMjDQpzdF9oZWlnaHRfR09MRCA8LSBzdW1tYXJ5U0UoZGZfR09MRCwgbWVhc3VyZXZhcj0iaGVpZ2h0X21tIiwgZ3JvdXB2YXJzPWMoImRhdGVfY29sbGVjdGVkIikpDQpzdF9oZWlnaHRfR09MRCANCg0KIyMgQm9keSBDb25kaXRpb24gIyMNCnN0X2NvbmRpdGlvbl9HT0xEPC0gc3VtbWFyeVNFKGRmX0dPTEQsIG1lYXN1cmV2YXIgPSAiY29uZGl0aW9uX3Njb3JlIiwgZ3JvdXB2YXJzID0gYygiZGF0ZV9jb2xsZWN0ZWQiKSkNCnN0X2NvbmRpdGlvbl9HT0xEDQoNCmBgYA0KI0dPTEQgUHJvcG9ydGlvbnMgZ3JhcGggQm9keSBjb25kaXRpb24gc2NvcmVzDQoNCmBgYHtyfQ0KDQpHT0xEX0JDU19wcm9wb3J0aW9uczwtIGRmX0dPTEQgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KICBncm91cF9ieShzaXRlLCBtb250aCwgeWVhciwgY29uZGl0aW9uX3Njb3JlX2JpbikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoQ291bnQ9IG4oKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKFByb3BvcnRpb24gPSBDb3VudC9zdW0oQ291bnQpKQ0KDQpHT0xEX0JDU19wcm9wb3J0aW9uczwtIG5hLm9taXQoR09MRF9CQ1NfcHJvcG9ydGlvbnMpDQoNCkJDU19wcm9wb3J0aW9uX0dPTEQgPC0gZ2dwbG90KGRhdGE9R09MRF9CQ1NfcHJvcG9ydGlvbnMsIGFlcyh4PW1vbnRoLCB5PSBQcm9wb3J0aW9uLCBmaWxsPWNvbmRpdGlvbl9zY29yZV9iaW4pKSArDQogIGdlb21fYmFyKHdpZHRoID0gLjUsIHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIsIGNvbG91ciA9ICJibGFjayIpKyAgDQogICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkdvbGQgU3RhciBCZWFjaCBQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyIsIHggPSJtb250aCIsIHkgPSAiUHJvcG9ydGlvbiBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgIikrIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID05MCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCkpKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpKSsNCnNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiLCBkaXJlY3Rpb24gPSAtMSkrDQogIGZhY2V0X3dyYXAofiB5ZWFyKQ0KQkNTX3Byb3BvcnRpb25fR09MRA0KDQoNCiAgDQpwZGYocGFzdGUwKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQiICwiL0dPTERfQkNTX3Byb3BvcnRpb24ucGRmIiksIGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQpwcmludChCQ1NfcHJvcG9ydGlvbl9HT0xEKQ0KZGV2Lm9mZigpDQpgYGANCg0KIyAlIG9mIHNjb3JlcyA+MyBhdCBnb2xkIGp1bmUgLSBub3ZlbWJlciANCmBgYHtyfQ0KZGZfR09MRA0KDQpHT0xEX3BlcmNlbnRfZ3JlYXRlcl8zIDwtIGRmX0dPTEQgJT4lDQogIGRwbHlyOjpncm91cF9ieShtb250aCwgeWVhcikgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UoUGVyY2VudGFnZSA9IG1lYW4oY29uZGl0aW9uX3Njb3JlIDw9IDMpKjEwMCkNCkdPTERfcGVyY2VudF9ncmVhdGVyXzMNCg0KR09MRF9CQ1NfcGVyY2VudGFnZSA8LSBHT0xEX3BlcmNlbnRfZ3JlYXRlcl8zICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IFBlcmNlbnRhZ2UpKSArDQogICNnZW9tX2Jhcih3aWR0aCA9IDAuNSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArDQogICAgZ2VvbV9jb2woKSsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0ID0gMSksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSA5MCksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4zKSwgYW5nbGUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJHb2xkIFN0YXIgQmVhY2ggJSBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgPj0gMyIsDQogICAgeCA9ICJtb250aCIsDQogICAgeSA9ICJQZXJjZW50YWdlIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyA+PSAzIg0KICApICtmYWNldF93cmFwKH55ZWFyKSArDQogICNzY2FsZV94X2NvbnRpbnVvdXMoIGJyZWFrcyA9IHNlcSg1LDEyLCBieSA9MSkgKSsNCiAgI3lsaW0oMCwxMDApKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDApLCBicmVha3MgPSBzZXEoMCwxMDAsIGJ5ID0gMTApKSANCg0KICAgIA0KR09MRF9CQ1NfcGVyY2VudGFnZQ0KDQpwZGYocGFzdGUwKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQiLCAiL0dPTERfQkNTX3BlcmNlbnRhZ2UucGRmIiksaGVpZ2h0ID0gNywgd2lkdGggPSAxMykNCnByaW50KEdPTERfQkNTX3BlcmNlbnRhZ2UpDQpkZXYub2ZmKCkgDQoNCg0KDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1kZl9HT0xELCBhZXMoeD1tb250aCwgeT1oZWlnaHRfbW0sIGdyb3VwPSBtb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJHb2xkc3RhciBCZWFjaCBNZWFuIFNoZWxsIEhlaWdodCAiLCB4ID0ibW9udGgiLCB5ID0gIk1lYW4gU2hlbGwgSGVpZ2h0IChtbSkiKSArICNzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPSBjKDQsMTEpLCBicmVha3MgPSBzZXEoNSwxMCwgYnkgPTEpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkrIGZhY2V0X3dyYXAofnllYXIpDQoNCmBgYA0KDQpgYGB7cn0NCiNDb25kaXRpb24gZGlzdHJpYnV0aW9uIGFjcm9zcyBhbGwgc2FtcGxlIG1vbnRocyAtIDIwMjMNCmdncGxvdChkYXRhPWRmX0dPTEQyMDIzLCBhZXMoeD0gY29uZGl0aW9uKSkgKw0KICBnZW9tX2JhcigpKyAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJmb3Jlc3RncmVlbiIsIm9yYW5nZSIsICJwdXJwbGUiKSkrDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iR29sZHN0YXIgQmVhY2ggIEJvZHkgQ29uZGl0aW9uIFNjb3JlIC0gMjAyMyAiLCB4ID0iQ29uZGl0aW9uIGNhdGVnb3JpemF0aW9uIikrDQogICAgZmFjZXRfd3JhcCh+IG1vbnRoLCBzY2FsZXMgPSAiZnJlZSIpDQoNCiNDb25kaXRpb24gZGlzdHJpYnV0aW9uIGFjcm9zcyBhbGwgc2FtcGxlIG1vbnRocyAtIDIwMjQNCmdncGxvdChkYXRhPWRmX0dPTEQyMDI0LCBhZXMoeD0gY29uZGl0aW9uKSkgKw0KICBnZW9tX2JhcigpKyAgI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJmb3Jlc3RncmVlbiIsIm9yYW5nZSIsICJwdXJwbGUiKSkrDQogIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iR29sZHN0YXIgQmVhY2ggIEJvZHkgQ29uZGl0aW9uIFNjb3JlIC0gMjAyNCIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KI01lYW4gQm9keSBjb25kaXRpb24gcGVyIG1vbnRoDQpnZ3Bsb3QoZGF0YT1kZl9HT0xELCBhZXMoeD0gbW9udGgsIHk9IGNvbmRpdGlvbl9zY29yZSwgZ3JvdXAgPSBtb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogIGxhYnModGl0bGU9IkdvbGRzdGFyIEJlYWNoICBNZWFuIEJvZHkgQ29uZGl0aW9uIFNjb3JlICIsIHggPSJtb250aCIsIHk9ICIgY29uZGl0aW9uIHNjb3JlICgxLTkpIikrIHNjYWxlX3lfcmV2ZXJzZSgpICsgZmFjZXRfd3JhcCh+eWVhcikNCiAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkrDQoNCmBgYA0KDQoNCg0KDQojIExhdXJlbCBIb2xsb3cgU3VtbWFyeSAtIE5PIExPTkdFUiBBIFNUVURZIFNJVEUNCmBgYHtyfQ0KZGZfTEFVUjwtIGRhdGFfYWxsJT4lDQogIGZpbHRlcihzaXRlPT0iTEFVUiIpDQoNCiMjIFNoZWxsIEhlaWdodCAjIw0Kc3RfaGVpZ2h0X0xBVVIgPC0gc3VtbWFyeVNFKGRmX0xBVVIsIG1lYXN1cmV2YXI9ImhlaWdodF9tbSIsIGdyb3VwdmFycz1jKCJkYXRlX2NvbGxlY3RlZCIpKQ0Kc3RfaGVpZ2h0X0xBVVIgDQoNCiMjIEJvZHkgQ29uZGl0aW9uICMjDQojIyBFeGNsdWRlcyBNYXkgZHVlIHRvIHNjb3Jpbmcgc3lzdGVtIGNoYW5nZS4gTWF5IHNjb3JlZCBmYXQsIG1lZGl1bSwgd2F0ZXJ5LiANCnN0X2NvbmRpdGlvbl9MQVVSPC0gc3VtbWFyeVNFKGRmX0xBVVIsIG1lYXN1cmV2YXIgPSAiY29uZGl0aW9uX3Njb3JlIiwgZ3JvdXB2YXJzID0gYygiZGF0ZV9jb2xsZWN0ZWQiKSkNCnN0X2NvbmRpdGlvbl9MQVVSDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1kZl9MQVVSLCBhZXMoeD1tb250aCwgeT1oZWlnaHRfbW0sIGdyb3VwPSBtb250aCkpICsNCiAgZ2VvbV9ib3hwbG90KCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSIgTGF1cmVsIEhvbGxvdyBNZWFuIFNoZWxsIEhlaWdodCAtIDIwMjMiLCB4ID0ibW9udGgiLCB5ID0gIk1lYW4gU2hlbGwgSGVpZ2h0IChtbSkiKQ0KDQoNCmBgYA0KYGBge3J9DQojQ29uZGl0aW9uIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgYWxsIHNhbXBsZSBtb250aHMNCmdncGxvdChkYXRhPWRmX0xBVVIsIGFlcyh4PSBjb25kaXRpb24pKSArDQogIGdlb21fYmFyKCkrICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImZvcmVzdGdyZWVuIiwib3JhbmdlIiwgInB1cnBsZSIpKSsNCiAgdGhlbWVfYncoKSArICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsgDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlPSJMYXVyZWwgSG9sbG93IEJvZHkgQ29uZGl0aW9uIGluZGV4IC0gMjAyMyIsIHggPSJDb25kaXRpb24gY2F0ZWdvcml6YXRpb24iKSsNCiAgICBmYWNldF93cmFwKH4gbW9udGgsIHNjYWxlcyA9ICJmcmVlIikNCg0KDQojTWVhbiBCb2R5IGNvbmRpdGlvbiBwZXIgbW9udGgNCmdncGxvdChkYXRhPWRmX0xBVVIsIGFlcyh4PSBtb250aCwgeT0gY29uZGl0aW9uX3Njb3JlLCBncm91cCA9IG1vbnRoKSkgKw0KICBnZW9tX2JveHBsb3QoKSsgICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZm9yZXN0Z3JlZW4iLCJvcmFuZ2UiLCAicHVycGxlIikpKw0KICB0aGVtZV9idygpICsgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKyANCiAgbGFicyh0aXRsZT0iTGF1cmVsIEhvbGxvdyBNZWFuIEJvZHkgQ29uZGl0aW9uIFNjb3JlIC0gMjAyMyIsIHggPSJtb250aCIsIHk9ICIgY29uZGl0aW9uIHNjb3JlICgxLTkpIikrIHNjYWxlX3lfcmV2ZXJzZSgpDQogICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KYGBgDQojTEFVUiBQcm9wb3J0aW9ucyBncmFwaCBCb2R5IGNvbmRpdGlvbiBzY29yZXMgLSAyMDIzIChvbmx5IHNhbXBsZWQgb25lIHllYXIpDQoNCmBgYHtyfQ0KDQpMQVVSX0JDU19wcm9wb3J0aW9uczwtIGRmX0xBVVIgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KICBncm91cF9ieShzaXRlLCBtb250aCwgY29uZGl0aW9uX3Njb3JlX2JpbiwgeWVhcikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoQ291bnQ9IG4oKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKFByb3BvcnRpb24gPSBDb3VudC9zdW0oQ291bnQpKQ0KDQpMQVVSX0JDU19wcm9wb3J0aW9uczwtIG5hLm9taXQoTEFVUl9CQ1NfcHJvcG9ydGlvbnMpDQoNCkxBVVJfQkNTX3Byb3BvcnRpb25zDQoNCkJDU19wcm9wb3J0aW9uX0xBVVI8LSBnZ3Bsb3QoZGF0YT1MQVVSX0JDU19wcm9wb3J0aW9ucywgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikrICANCiAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEpKSsNCiAgbGFicyh0aXRsZT0iTGF1cmVsIEhvbGxvdyBQcm9wb3J0aW9uIG9mIGJvZHkgY29uZGl0aW9uIHNjb3JlcyAtIDIwMjMiLCB4ID0ibW9udGgiLCB5ID0gIlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzICIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjMpLCBhbmdsZSA9IDApKSsNCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSkNCiAgI2ZhY2V0X3dyYXAofiB5ZWFyKQ0KICNzY2FsZV9maWxsX2JyZXdlcigpICsNCiAgI2ZhY2V0X3dyYXAofiBzaXRlKQ0KDQpCQ1NfcHJvcG9ydGlvbl9MQVVSDQogIA0KcGRmKHBhc3RlMChwYXRoID0gIkxhYl9EYXRhX1Rpc3N1ZVByb2Nlc3Npbmcvb3V0cHV0IiAsIi9MQVVSX0JDU19wcm9wb3J0aW9uLnBkZiIpLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoQkNTX3Byb3BvcnRpb25fTEFVUikNCmRldi5vZmYoKQ0KYGBgDQojICUgb2Ygc2NvcmVzID4zIGF0IExBVVIganVuZSAtIG5vdmVtYmVyIA0KYGBge3J9DQoNCiNyZW1vdmluZyAwODIzRkVOQ18yOCBiY3Mgd2FzIE5BDQpkZl9MQVVSLiA8LSBkZl9MQVVSJT4lZmlsdGVyKCFyb3dfbnVtYmVyKCkgJWluJSBjKDIpKQ0KDQpMQVVSX3BlcmNlbnRfZ3JlYXRlcl8zIDwtIGRmX0xBVVIuICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkobW9udGgsIHNpdGUsIHllYXIpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKFBlcmNlbnRhZ2UgPSBtZWFuKGNvbmRpdGlvbl9zY29yZSA8PSAzKSoxMDApDQpMQVVSX3BlcmNlbnRfZ3JlYXRlcl8zDQoNCkxBVVJfQkNTX3BlcmNlbnRhZ2UgPC0gTEFVUl9wZXJjZW50X2dyZWF0ZXJfMyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBQZXJjZW50YWdlKSkgKw0KICAjZ2VvbV9iYXIod2lkdGggPSAwLjUsIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKw0KICAgIGdlb21fY29sKCkrDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gOTApLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMyksIGFuZ2xlID0gMCksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiR29sZCBTdGFyIEJlYWNoICUgb2YgYm9keSBjb25kaXRpb24gc2NvcmVzID49IDMiLA0KICAgIHggPSAibW9udGgiLA0KICAgIHkgPSAiUGVyY2VudGFnZSBvZiBib2R5IGNvbmRpdGlvbiBzY29yZXMgPj0gMyINCiAgKSAjK2ZhY2V0X3dyYXAofnllYXIpDQogICMrIHNjYWxlX3hfY29udGludW91cyggYnJlYWtzID0gc2VxKDUsMTIsIGJ5ID0xKSApKw0KICAjeWxpbSgwLDYwKSsgDQogICNzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwMCksIGJyZWFrcyA9IHNlcSgwLDEwMCwgYnkgPSAxMCkpIA0KDQogICAgDQpMQVVSX0JDU19wZXJjZW50YWdlDQoNCnBkZihwYXN0ZTAocGF0aCA9ICJMYWJfRGF0YV9UaXNzdWVQcm9jZXNzaW5nL291dHB1dCIsICIvTEFVUl9CQ1NfcGVyY2VudGFnZS5wZGYiKSxoZWlnaHQgPSA3LCB3aWR0aCA9IDEzKQ0KcHJpbnQoTEFVUl9CQ1NfcGVyY2VudGFnZSkNCmRldi5vZmYoKSANCg0KDQoNCmBgYA0KDQpgYGB7cn0NCiNDb2RpbmcgZ3JhcGhzIGZvciBMSVMgQ29uZmVyZW5jZSAtIG9ubHkgMjAyMyBkYXRhDQpkYXRhXzIwMjMgPC0gZGF0YV9hbGwlPiUgIGZpbHRlcigheWVhcj09IjIwMjQiKQ0KDQpkZl9CQ1NfcHJvcG9ydGlvbnM8LSBkYXRhXzIwMjMgJT4lDQogIG11dGF0ZShjb25kaXRpb25fc2NvcmVfbnVtZXJpYyA9IGFzLm51bWVyaWMoY29uZGl0aW9uX3Njb3JlKSxjb25kaXRpb25fc2NvcmVfYmluID0gY2FzZV93aGVuKGNvbmRpdGlvbl9zY29yZSA9PSAxIH4gIjEiLCBjb25kaXRpb25fc2NvcmUgPT0gMiB+IjIiLGNvbmRpdGlvbl9zY29yZSA9PSAzIH4gIjMiLCBjb25kaXRpb25fc2NvcmUgPT0gNCB+IjQiLGNvbmRpdGlvbl9zY29yZSA9PSA1IH4gIjUiLCBjb25kaXRpb25fc2NvcmUgPT0gNiB+IjYiLGNvbmRpdGlvbl9zY29yZSA9PSA3IH4gIjciLCBjb25kaXRpb25fc2NvcmUgPT0gOCB+IjgiLCBjb25kaXRpb25fc2NvcmUgPT05IH4iOSIsIFRSVUUgfiBhcy5jaGFyYWN0ZXIoY29uZGl0aW9uX3Njb3JlKSkpICU+JQ0KICBncm91cF9ieShzaXRlLCBtb250aCwgY29uZGl0aW9uX3Njb3JlX2JpbikgJT4lIGRwbHlyIDo6c3VtbWFyaXNlKENvdW50PSBuKCkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShQcm9wb3J0aW9uID0gQ291bnQvc3VtKENvdW50KSkNCg0KZGZfQkNTX3Byb3BvcnRpb25zPC0gbmEub21pdChkZl9CQ1NfcHJvcG9ydGlvbnMpDQoNCmRmX0JDU19wcm9wb3J0aW9ucyRtb250aCA8LSBmYWN0b3IoZGZfQkNTX3Byb3BvcnRpb25zJG1vbnRoLCBsZXZlbHMgPSBjKCI1IiwiNiIsIjciLCAiOCIsICI5IiwgIjEwIiwgIjExIiksDQogICAgICAgIGxhYmVscz1jKCJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1ZyIsICJTZXB0IiwgIk9jdCIsICJOb3YiKSkNCmRmX0JDU19wcm9wb3J0aW9ucyRzaXRlIDwtIGZhY3RvcihkZl9CQ1NfcHJvcG9ydGlvbnMkc2l0ZSwgbGV2ZWxzID0gYygiQVNIQyIsIkZFTkMiLCJHT0xEIiwgIkxBVVIiKSwNCiAgICAgICAgbGFiZWxzPWMoIkFzaCBDcmVlayIsICJGZW5jZSBDcmVlayIsICJHb2xkIFN0YXIiLCAiTGF1cmVsIEhvbGxvdyIpKQ0KDQpiY3MucHJvcC4yMDIzIDwtIGdncGxvdChkYXRhPWRmX0JDU19wcm9wb3J0aW9ucywgYWVzKHg9bW9udGgsIHk9IFByb3BvcnRpb24sIGZpbGw9Y29uZGl0aW9uX3Njb3JlX2JpbikpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAuNSwgc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3VyID0gImJsYWNrIikrICANCiAgIHRoZW1lX2J3KCkgKyAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0PTEsIHNpemUgPSByZWwoLjkpKSkrDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9ZWxlbWVudF9ibGFuaygpKSsNCiAgbGFicyh0aXRsZT0iQm9keSBjb25kaXRpb24gc2NvcmVzIGluIDIwMjMiLCB4ID0iTW9udGgiLCB5ID0gIlByb3BvcnRpb24gb2YgYm9keSBjb25kaXRpb24gc2NvcmVzICIpKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLCBhbmdsZSA9OTApLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLCBhbmdsZSA9IDApKSsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKSsNCiAgdGhlbWUgKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSsNCiAgdGhlbWUodGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSkrDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNykpKw0KICBsYWJzKGZpbGwgPSJCb2R5IENvbmRpdGlvbiBTY29yZSIpKw0KICBmYWNldF93cmFwKH4gc2l0ZSApDQpiY3MucHJvcC4yMDIzDQoNCiNwZGYocGFzdGUwKHBhdGggPSAiTGFiX0RhdGFfVGlzc3VlUHJvY2Vzc2luZy9vdXRwdXQiICwiL0JDU19wcm9wb3J0aW9uXzIwMjMucGRmIiksIGhlaWdodCA9IDcsIHdpZHRoID0gMTMpDQojcHJpbnQoYmNzLnByb3AuMjAyMykNCiNkZXYub2ZmKCkNCg0KI0JDU19wcm9wb3J0aW9uX2FsbCtzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAzQzMwIiwiIzAxNjY1RSIsIiM4MENEQzEiLCIjQzdFQUU1IiwiI0Y2RThDMyIsIiNERkMyN0QiLCIjQkY4MTJEIiwgIiM4QzUxMEEiLCIjNTQzMDA1IiApKQ0KI3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDNDMzAiLCIjMDE2NjVFIiwiIzgwQ0RDMSIsIiNDN0VBRTUiLCJhenVyZTEiLCJzbGF0ZWdyYXkxIiwic2xhdGVncmF5MyIsICJzbGF0ZWdyYXk0IiwgImdyYXkyNSIgKSkgDQoNCmYgPC0gZnVuY3Rpb24ocGFsKSBicmV3ZXIucGFsKGJyZXdlci5wYWwuaW5mb1twYWwsICJtYXhjb2xvcnMiXSwgcGFsKQ0KKGNvbHMgPC0gZigiWWxHbkJ1IikpDQpgYGANCg0KYGBge3J9DQojQ29kaW5nIGdyYXBocyBmb3IgTElTIENvbmZlcmVuY2UgLSBvbmx5IDIwMjMgZGF0YSAoY29udGludWVkKQ0KDQpkZl8zX3Byb3A8LSBzZWxlY3QoZGF0YV8yMDIzLCAtYygic2l0ZSIpKQ0KDQojQ291bnQgYW5kIHByb3BvcnRpb24gdGFibGUgZm9yIDIwMjMgYmNzIHNjb3JlcyBieSBtb250aA0KYmNzX3RhYmxlIDwtIHRhYmxlKGRhdGFfMjAyMyRjb25kaXRpb25fc2NvcmUsIGRhdGFfMjAyMyRtb250aCwgZGF0YV8yMDIzJHNpdGUpDQpuYW1lcyhkaW1uYW1lcyhiY3NfdGFibGUpKSA8LSBjKCJCb2R5IENvbmRpdGlvbiBTY29yZSIsICJNb250aCIsICJTaXRlIikNCmJjc190YWJsZSA8LSBhZGRtYXJnaW5zKGJjc190YWJsZSkNCmJjc190YWJsZQ0KDQpgYGANCg0KDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA0KDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==